
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 一个可选类型的值是什么语法糖吗
(这里我用的是隐式的可选类型 普通的可选类型应该也是一样)
1 Leviathann 2022 年 1 月 26 日 via iPhone if let 应该是 pattern matching 和 rust 一样 |
2 !运算符修饰后原类型变成 Optional<String>,if let 是可选值绑定,我一般理解成 if (x != nil) { x do something } 的简化写法 |
3 CommandZi 2022 年 1 月 26 日 看这里 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 就是语法糖 |
5 MakHoCheung 2022 年 1 月 26 日 你应该关注的是`隐式解析可选类型`,assumedString 其实还是可选类型 String? ,只是在使用 assumedString 不需要 ! 来解包,因为你用 String! 来声明这个可选类型是有值的。 这个时候又有一个疑问就是为什么不直接用 String ,因为某些情况下可能就是要声明变量是可选类型 |
6 infinityv OP @MakHoCheung 嗯 隐试解析其实就是普通的可选类型,这个明白。我举的例子用隐式解析会有点误导性质,这个问题和隐式不隐式没啥关系。实际上问题是“可选类型的值为啥只能用 if let 直接取出来” 楼上回答可能解释了 我看看先 |
7 cht 2022 年 1 月 26 日 |
8 CommandZi 2022 年 1 月 26 日 let assumedString: String? 或者 let assumedString: String! 实际上是真正的代码是 let assumedString: Optional<String> 这是一个名称是 Optional 的枚举,并不是「 Optional 标识」,这个搞清楚就很容易理解了,这里这个问号、叹号也是语法糖。 |