Optionals
这一块在我刚刚看 Swift
的时候简直是一脸懵逼,这回从头学习的时候决定好好来研究一下,多做一些记录。
我们先来看一段代码:
NSString *string = nil;
if ([string rangeOfString:@"swift"].location != NSNotFound) {
NSLog(@"this is a swift");
}
在上面的代码中,这个 NSLog 实际上是会被打印出来的,但我们实际的上这个 string 对象明明就是一个 nil 但是依然被还是可以进到if判断中去,这就说明我们在实际的编程中设定的这种判断值也不一定是百分之百的正确的。所以在 Swift 中引入了Optionals
这么一个概念。
Optionals
实际上是一个枚举类型,里面有 Some
和 None
两种类型,在 Swift 中的 nil 就是表示为 Optionals.None
,非 nil 就是 Optionals.Some(T)
。
var demoString : String?
demoString = "this optional.some"
print(demoString)
输出:"Optional("this optional.some")\n"
当我们输出 demoString
的时候系统虽然可以输出内容,但是会有个警告并且给了我们三种方式去修正这个 print(demoString)
这里我们先说第一种方式,后面再说其余的两种方式,这里的第一种方式就是 print(demoString!)
(Froce-unwarp the value to avoid this warning) 在后面加一个感叹后,这种方式称为 拆包 从Optionals.Some(T) 中取出这个 T 值。这个时候系统警告就会消失了并且输出了"this optional.some\n"
,但是我们在对某个 Optional
值进行拆包的时候一定要确保这个值是非 nil
的,不然编译器会报错。
我们还可以使用这种方法来判断一个 Optional
的值是否有值
var demoString : String?
demoString = "Hello world..."
if let tempString = demoString {
print("say \(tempString)")
} else {
print("demoString is nil")
}
上面我们说到有三种方式去修正 print(demoString)
,现在我们说下第二种方式 (Provide a default value to avoid this warning)这里要引出我们的主角 ??
,举个例子
var demoString : String?
demoString = "this optional.some"
print(demoString ?? "default value")
输出:"this optional.some\n"
那么其实 ??
也是一个三目运算,其实就等同于
a == nil ? default Value : a!
判断 a
是否是 nil
如果为 nil
就返回 default Value
那么如果不为 nil
就将 a
拆包后返回,那么关于这个 ??
就先介绍这么多,后续再给出细致的解释,就先深入到此。
关于 Optional
的介绍先到这里,如果后面我再对这个有新的理解的话再来增加内容。