新手问一个 Swift 可选类型解值的问题

2022-01-26 11:36:59 +08:00
 infinityv
let assumedString: String! = "An implicitly unwrapped optional string."

//let implicitString: String = assumedString  // 不需要感叹号

if let test1 = assumedString {	
print(test1)	
//输出 An implicitly unwrapped optional string.
}

let test2 = assumedString
print(test2)		
//输出  Optional("An implicitly unwrapped optional string.")

最近在入门 Swift 看到 [隐式解析可选类型] 这里 有个不太明白的点

上面这个例子 为啥在 if 语句的 body 里面才能输出可选类型的实际值 而普通的赋值只能输出可选类型(我理解就是带 Optional 标识

if 能够直接 unwrap 一个可选类型的值是什么语法糖吗

(这里我用的是隐式的可选类型 普通的可选类型应该也是一样)

833 次点击
所在节点    问与答
8 条回复
Leviathann
2022-01-26 11:44:46 +08:00
if let 应该是 pattern matching
和 rust 一样
zjddp
2022-01-26 12:07:48 +08:00
!运算符修饰后原类型变成 Optional<String>,if let 是可选值绑定,我一般理解成 if (x != nil) { x do something } 的简化写法
CommandZi
2022-01-26 12:08:16 +08:00
看这里
https://developer.apple.com/documentation/swift/optional
因为 Swift 里面 Optional 实际上是个包含范型的枚举,它的代码类似
enum Option<Value> {
case some(Value)
case none
}


所以你的 if let 语句
if let test1 = assumedString { }

实际上等价于
if case .some(let test1) = greeting {
print(test1)
}

也等价于
switch greeting {
case .some(let value):
print(value)
case .none:
break
}

在这里 if let 就是语法糖
CommandZi
2022-01-26 12:09:24 +08:00
@CommandZi enum Option<Value> -> enum Optional <Value>
MakHoCheung
2022-01-26 12:22:59 +08:00
你应该关注的是`隐式解析可选类型`,assumedString 其实还是可选类型 String? ,只是在使用 assumedString 不需要 ! 来解包,因为你用 String! 来声明这个可选类型是有值的。
这个时候又有一个疑问就是为什么不直接用 String ,因为某些情况下可能就是要声明变量是可选类型
infinityv
2022-01-26 12:48:24 +08:00
@MakHoCheung 嗯 隐试解析其实就是普通的可选类型,这个明白。我举的例子用隐式解析会有点误导性质,这个问题和隐式不隐式没啥关系。实际上问题是“可选类型的值为啥只能用 if let 直接取出来” 楼上回答可能解释了 我看看先
cht
2022-01-26 12:58:57 +08:00
CommandZi
2022-01-26 13:45:57 +08:00
let assumedString: String? 或者 let assumedString: String!
实际上是真正的代码是
let assumedString: Optional<String>

这是一个名称是 Optional 的枚举,并不是「 Optional 标识」,这个搞清楚就很容易理解了,这里这个问号、叹号也是语法糖。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/830684

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX