点击下方大众号卡片,重视我,每天共享一个关于 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新知”,每天准时共享一个新知识,这儿仅仅同步,想要及时学到就来重视我吧!