Swift学习之和Objective-C的联系与区别
swfit和OC间的区别
接下来都是一些 swift独有 的性质了1、swift独有的范围运算符 a...b 表示 [a,b] 如3...5 就是范围取3,4,5
a..<b 表示[a,b) 如3..<5 就是取范围3,4
可以直接写在 2、swift独有的溢出运算符 默认情况下,当你往一个整型常量或变量赋于一个它不能承载的大数时,Swift不会让你这么干的,它会报错。这样,在操作过大或过小的数的时候就很安全了。 var potentialOverflow = Int16.max
// potentialOverflow 等于 32767,这是 Int16 能承载的最大整数
potentialOverflow += 1
// 出错了
当然,你有意在溢出时对有效位进行截断,你可采用溢出运算,而非错误处理。Swfit为整型计算提供了5个&符号开头的溢出运算符。 &+,&-,&*,&/,&%
这里用上溢出做个举例 var willOverflow = UInt8.max // willOverflow 等于UInt8的最大整数 255
willOverflow = willOverflow &+ 1 // 这时候 willOverflow 等于 0
大概原理是 进了一位 物极必反 3、swift独有的元组类型 var point = (x:15,y:20.2)
就是元组名是 point ,里面有两个元素x和y。有点类似于结构体但是不是。 想取出里面的x的值赋值就是 point.x = 30 或者point.0 = 30 (注:元组里面的许多元素可以看作有数组的下标) 可以省略内部元素的名称 var point = (15,20.2) 但是这样的话,想取出值就只能用point.0 = 30 这一种方法了,因为人家没有元素名了好吧。 也可以明确指定元组内每一个元素的类型,假如那个20.2我不想要double类型 我想要是float类型。可以 注意:元组名称和类型不能共存 ,比如你指定类型了 后面就不可以再指定名称了 如果你想打印的话就写 并且在初始化的时候也可以用下划线省略不需要的元素 如 4、在switch语句中使用元组类型时还可以用类似SQL语句的语法 添加过滤条件 switch point{
case let(x,y) where x== y:
println("x与y的值相等");
等等。。。。。。
}
5、函数的外部参数名 函数原来的格式是这样(箭头后面是返回值) 调用时是 加外部参数名的话在方法调用时可读性更好,是写在原参数名的前面, 调用时也必须书写 即 调用时写 如果觉得这样有点麻烦,可以让外部参数名和内部参数名一样 就是 调用时写 6、函数的默认参数值 func addStudent (name:string,age:Int = 20) -->string{}
设置了默认的年龄为20 所以再调用时只需要写个名字 addStudent("james")
要注意的是,使用了默认参数值, 系统会自动生成一个外部参数名。 想改名字也就要写外部参数名了 即 7、函数的输入输出参数 在函数声明时就用inout代替var 这样以后可以在函数内部修改外面的值 类似于C语言的传入指针 func change (inout num:Int) {
num = 10
}
var a = 20
change(&a)
得到的结果就是10 (注意:写了输入输出参数就不能再用默认函数值的语法了) 用输入输出参数,实现多个返回值功能 func SumAndMinus(num1:Int,num2:Int,inout sum:Int,inout minus:Int){
sum = num1 + num2
minus = num1 - num2
}
var sum = 0,minus =0
SumAndMinus(20,5,∑,?)
原文:swift与OC之间不得不知道的21点 其他变化:一、 swift终于放弃了objective-c那幺蛾子般的 [ rect setX:10 y:20 width:100 height:500 ]
看看!多棒!swift当然不会丢弃这么好的传统, 在swift中是这个样子的 rect.set( 10,y:20,width:100,height:500 )
看看!!!完美吧! 1、全局函数的调用,不可以使用标签 fun( 11,22,33 ) //正确?
fun( n1:11,n2: 22,n3: 33 ) //错误?
2、类的函数,第一个参数不可以加标签 。 rect.set( 100,y:100,width:300,height: 200 ) //正确?
rect.set( x:100,height: 200 ) //错误?
其实swift中对类的定义和java,c#几乎一样,再也不分头文件和.m文件了。 class Weapon {
var name:NSString
var power:int
init( name:NSString,power:int )
{
self.name = name
self.power = power
}
func shoot( )
}
注意:swift中的语句不需要分号结束( swift在吸引幼齿入swift大法方面无不用其极!) Weapon weapon = Weapon( name:“人间大炮”,power: 100000000000 )
我才没有写错, 对的!现在和java,c#一样!虽然weapon是一个指针,但不要写那颗星号!!因为这颗星号吓死过好多人!“ 啥?指针?!!啊。。。。。”(吓死了) c, c++的程序员注意了,这个weapon对象不是分配在栈内存上的, 仍然是alloc出来的, 在堆上呢。 二、最期待的语法终于加入了! 对于 @interface Weapon
-(void)shoot;
@end
@interface Gun : Weapon
-(void)Shoot;
@end
在大项目中经常会遇到这个问题,程序员的本意是希望覆盖父类的shoot,结果手潮。。。。写成了 Weapon* currentWeapon = [ Gun new ]; [currentWeapon shoot ];
中调用的却是父类的 override func shoot{
}
这样,编译器一看方法前写了 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |