运算符
只讨论与其他语言有差别的部分.大部分的用法还是C系语言的用法.
赋值运算符( = )不再返回值
其他的高级语言,例如Java以及Objective-C,赋值运算符都是会返回赋值之后的值.
int a = 0;
int b = 1;
b = a; //该表达式返回 1
但是在Swift中,赋值运算符无返回值(包括 +=
-=
),也就是说
var a = 0
var b = 1
if a = b //此句编译错
{
...
}
这样可以避免我们以前写条件表达式少写了一个 = 的情况.
另外赋值运算符可以对元组进行操作.
let (errorNo,errorMsg) = (404,"page not found")
print(errorNo); //输出404
print(errorMsg); //输出 "page not found"
相当于定义了两个常量,并且用元组中的元素对其赋值.
默认情况下不允许值溢出
也就是说,编译器会检查运算式.当结果超出了类型的范围.会编译报错.例如
var bigInt = Int.max + 1 //报错
除非使用了Swift的溢出运算符.但是我没有想到溢出运算符的使用场景.此处不讨论.
取模(取余数) 支持浮点数
8 % 2.5 // 等于 0.5
自增( ++ )和自减( - - )
Swift2 还支持这两个运算符,但是在Xcode7.3下已经会报警告.说明会在Swift3中移除这两个运算符.起初我是很疑惑的,挺方便的运算符为什么要移除掉呢?后来查了Swift的github,发现有说明原因,对于我这种学过其他语言的程序员来说,这基本没有学习成本.因为我已经从以前的经验中知道了这两个运算符的特性.但是对于没有编程经验的人来说,会对它们比较疑惑.就好像我最初学C语言的时候,也花了一些时间才搞清楚它们的优先级以及它们放在变量前面和后面的区别.
那么我们怎么自增一个变量呢?
var i = 0
i += 1
参考自 swift-evolution
一元正号运算符(强迫症运算符)
我们用 - 来表示一个复数 例如
var a = 1
var b = -a
我们也可以用一个 + 来增加代码的对称美
var a = -1
var b = +a //此处b的值 仍旧是-1
也就是说,正号运算符什么都不会做.也就是说,并没有什么卵用.
恒等 === 以及 不恒等 !==
上一次看到这个运算符还是在js里面.这个运算符会判断运算符两边的对象是否是同一个对象实例(内存地址相同?)
空合运算符(Nil Coalescing Operator)
说这个首先要说可选(Optional)类型
是什么.之前有说过,变量除非声明为可选类型,否则必须初始化.从字面意思看,可选类型就是可以为nil
的类型.在没有值的情况下,它的值是nil.我们可以用if a == nil
来判断它是否为空.另外Swift的nil跟OC有一些差别,在OC中只有对象类型可以为nil,但是在Swift中,基本数据类型也可以为nil
定义一个可选类型的变量:
var optVar:Int? //需要显式指明类型.
可选类型的变量不能直接与其他值做运算.需要使用!
解封,以告诉编译器,我明确知道这个变量是有值的.
var optVar:Int?
optVar = 1;
//var b = optVar+1; 此句代码会编译出错
var b = optVar! + 1 //正确用法
这个设计我不太明白是以什么为出发点.我感觉增加了语言的难度.
空合运算符 a ?? b
会对可选类型进行空判断,如果 a
不为 nil
,返回 a
,如果 a
为空,则返回 b
,另外 b
的数据类型必须跟 a
一致.
var optVar:String?
var c = optVar ?? "opt Var is nil" // c的值为 "opt Var is nil"
区间运算符
用来表达一个区间的值的运算符
闭区间运算符
a ... b
定义一个从 a 到 b (包括a,b) 的所有值的区间.a 的值 不能超过 b.
for i in 0 ... 10
{
print("\(i)"); //会运行11次
}
半开区间运算符
a ..< b
定义一个从 a 到 b - 1 的区间的值.也就是包前不包后.
for i in 0 ..< 10
{
print("\(i)"); //运行10次
}
这个运算符据说是为了方便遍历数组.也就是 0 ..< array.count
,这样不会造成数组下标越界.
测试了一下这两个运算符,貌似只能对整数使用.另外运算符的返回结果是一个Range
对象,但是跟NSRange
完全是两码事.反而有点像Java中的迭代器.这个可以以后研究一下.