点击下方公众号卡片,关注我,每天分享一个关于 iOS 的新知识
1、可选类型其实是个枚举
我们先来定义一个可选类型,打印他的类型看看:
python
let str: String? = ""
print(type(of: str))
这段代码输出 Optional<String>
,那么再点进 Optional
类型看下声明:
java
enum Optional<Wrapped> : ExpressibleByNilLiteral {
case none
case some(Wrapped)
}
可以看出其实 Optional
是个枚举类型,其中有两个 case:none
(代表无值) 和 some(Wrapped)
(代表有值)。
2、Optional.none == nil
print(Optional.none == nil)
猜猜这样代码打印什么?
实际上会打印 true
,上边了解了 Optional
的本质,那么就不难知道 none
就代表 nil
,无值。
3、Optional.some
vbnet
let num: String? = "123"
let num1 = Optional.some("123")
print(num == num1)
我想上边的代码不用猜你也知道会打印 true
了,其实用 Optional.some
来生成一个可选类型和直接在类型后添加问号是一样的,也可以用 String?.some("123")
,也是一样的。
4、可以用 switch case 来解析可选类型
上边已经知道了可选类型其实是枚举 enum
,想到枚举,第一想到的就是用 switch
来做值的判断:
swift
let name: String? = "iOS 新知"
switch name {
case .none:
print("name 为 nil")
case .some(let name):
print("name 有值,且值为: \(name)")
}
上边代码打印:name 有值,且值为: iOS 新知
5、可选情况的比较
swift
let str: String? = nil
let str1: String?? = nil
print(str == nil)
print(str1 == nil)
print(str == str1)
考虑上述代码打印结果,前两个 print 打印 true,是完全符合预期的。
最后一个 print 打印 false,不符合我们的直觉,明明两个都是 nil,为什么不相等?我特意翻了一遍 swift 这块源码[1],两个可选类型的对比方法是这样实现的:
swift
static func ==(lhs: Wrapped?, rhs: Wrapped?) -> Bool {
switch (lhs, rhs) {
case let (l?, r?):
return l == r
case (nil, nil):
return true
default:
return false
}
}
这段代码执行的时候,先尝试对两个可选类型进行解包,如果都能解包,则走第一个 case。如果都为 nil,则 return true
。其他情况 return false
。上述的例子中 str 和 str1 正是命中了最后一种情况,直接 return false
。
参考资料
[1]
swift Optional 源码: github.com/apple/swift...
这里每天分享一个 iOS 的新知识,快来关注我吧
本文同步自微信公众号 "iOS新知",每天准时分享一个新知识,这里只是同步,想要及时学到就来关注我吧!