ios: swift 关于可选类型你可能还不知道的5件事情

点击下方公众号卡片,关注我,每天分享一个关于 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新知",每天准时分享一个新知识,这里只是同步,想要及时学到就来关注我吧!

相关推荐
2501_915921433 小时前
iOS 是开源的吗?苹果系统的封闭与开放边界全解析(含开发与开心上架(Appuploader)实战)
android·ios·小程序·uni-app·开源·iphone·webview
2501_915909067 小时前
原生 iOS 开发全流程实战,Swift 技术栈、工程结构、自动化上传与上架发布指南
android·ios·小程序·uni-app·自动化·iphone·swift
2501_915106327 小时前
Comodo HTTPS 在工程中的部署与排查实战(证书链、兼容性与真机抓包策略)
网络协议·http·ios·小程序·https·uni-app·iphone
2501_915909067 小时前
苹果软件混淆与 iOS 代码加固趋势,IPA 加密、应用防反编译与无源码保护的工程化演进
android·ios·小程序·https·uni-app·iphone·webview
2501_916007477 小时前
苹果软件混淆与 iOS 应用加固实录,从被逆向到 IPA 文件防反编译与无源码混淆解决方案
android·ios·小程序·https·uni-app·iphone·webview
Zender Han12 小时前
Flutter 实现人脸检测 — 使用 google_mlkit_face_detection
android·flutter·ios
大熊猫侯佩12 小时前
月球矩阵日志:Swift 6.2 主线程隔离抉择(下)
swift·编程语言·apple
大熊猫侯佩12 小时前
月球矩阵日志:Swift 6.2 主线程隔离抉择(上)
swift·编程语言·apple
2501_9160088913 小时前
iOS 26 性能分析深度指南 包含帧率、渲染、资源瓶颈与 KeyMob 协助策略
android·macos·ios·小程序·uni-app·cocoa·iphone
HarderCoder15 小时前
Swift 并发深度指南:非结构化任务与分离任务全解析
swift