点击下方大众号卡片,重视我,每天共享一个关于 iOS 的新知识
1、可选类型其实是个枚举
我们先来定义一个可选类型,打印他的类型看看:
letstr:String?=""
print(type(of:str))
这段代码输出 Optional<String>
,那么再点进 Optional
类型看下声明:
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
letnum:String?="123"
letnum1=Optional.some("123")
print(num==num1)
我想上边的代码不用猜你也知道会打印 true
了,其有用 Optional.some
来生成一个可选类型和直接在类型后增加问号是一样的,也可以用 String?.some("123")
,也是一样的。
4、可以用 switch case 来解析可选类型
上边现已知道了可选类型其实是枚举 enum
,想到枚举,第一想到的便是用 switch
来做值的判别:
letname:String?="iOS新知"
switchname{
case.none:
print("name为nil")
case.some(letname):
print("name有值,且值为:\(name)")
}
上边代码打印:name 有值,且值为: iOS 新知
5、可选状况的比较
letstr:String?=nil
letstr1:String??=nil
print(str==nil)
print(str1==nil)
print(str==str1)
考虑上述代码打印成果,前两个 print 打印 true,是完全符合预期的。
最终一个 print 打印 false,不符合我们的直觉,分明两个都是 nil,为什么不相等?我特意翻了一遍 swift 这块源码[1],两个可选类型的对比办法是这样实现的:
staticfunc==(lhs:Wrapped?,rhs:Wrapped?)->Bool{
switch(lhs,rhs){
caselet(l?,r?):
returnl==r
case(nil,nil):
returntrue
default:
returnfalse
}
}
这段代码履行的时分,先测验对两个可选类型进行解包,假如都能解包,则走第一个 case。假如都为 nil,则 return true
。其他状况 return false
。上述的例子中 str 和 str1 正是命中了最终一种状况,直接 return false
。
参考资料
[1]
swift Optional 源码: github.com/apple/swift…
这儿每天共享一个 iOS 的新知识,快来重视我吧
本文同步自微信大众号 “iOS新知”,每天准时共享一个新知识,这儿仅仅同步,想要及时学到就来重视我吧!