空值合并运算符和区间运算符
今天主要看的内容是 Swift 中的基本运算符。记录一下。
Nil Coalescing Operator
a ?? b 中的 ?? 就是是空值合并运算符,会对 a 进行判断,如果不为 nil 则解包,否则就返回 b 。
var a: String? = "a"
var b: String? = "b"
var c = a ?? b // "a"
a = nil
c = a ?? b // "b"
b = nil
c = a ?? b ?? "c" // "c"
使用的时候有以下两点要求:
a 必须是 optional 的
b 必须和 a 类型一致
也就是说,a 一定要有被备胎的可能,b 一定要有做备胎的资格。
其实也就是对三目运算符的简写:
复制代码
a != nil ? a! : b 或者 a == nil ? b : a!
当然你也可以通过自定义运算符来实现:
infix operator ||| {}
func |||<T> (left: T?, right: T) -> T {
if let l = left {
return l
}
return right
}
var a:String?
var b = "b"
var c = a ||| b
C# 中也有个 ?? ,感兴趣的可以去了解一下。
Range Operator
区间运算符分为闭区间 (...) 和左闭右开区间 (..<) 两种,前者是算头算尾,后者是算头不算尾。
可以应用在 switch 中:
switch aNumber
{
case 0...5:
println("This number is between 0 and 5")
case 6...10:
println("This number is between 6 and 10")
default:
println("This number is not between 0 and 10")
}
区间运算符其实返回的是一个 Range<T> 对象,是一个连续无关联序列索引的集合。
话说以前左闭右开是 .. ,这样和 Ruby 的就刚好完全相反了。。。
不过有人就是想用 .. ,那么可以这样自己写一个:
infix operator .. { associativity none precedence 135}
func .. (lhs: Int, rhs: Int) -> Range<Int> {
return lhs..<rhs
}
for i in 0..10 {
println("index (i)")
}








