怎么理解 Optionals,个人觉得多此一举啊

2014-07-31 15:04:06 +08:00
 nagato
首先,我表示在看完Swift对这个概念的所有描述后,还是很模糊没有完全理解它的意义。

我的拙见是:

1. 对于所有属于对象的类型,已经有nil可以去判断了,而且nil相当好用啊(不觉得吗?)

2. 那么Optionals的诞生,应该只是填补了一些基础类型(如int, double)无法用nil去判断的空白

3. 如果说 let myValue: String? = "MyValue” 存在的意义是能够适时判断myValue值是否存在,那么 let myValue: String! = "MyValue”存在的意义又是什么? 仅仅是为了在调用的时候省去那一个烦人的‘!’号? 那我觉得也没必要为此专门创建一种写法吧?

4. 还有一点没想明白,
let convertedNumber = possibleNumber.toInt()
if convertedNumber {
println("\(convertedNumber!)")
}
这么用就必须得加‘!’

if let actualNumber = possibleNumber.toInt() {
println("\(actualNumber)")
}
这么用就可以不加‘!’, 这是什么逻辑??
convertedNumber, actualNumber的类型不是始终都是 optional Int 么。。。
4404 次点击
所在节点    Swift
5 条回复
headwindx
2014-07-31 16:14:15 +08:00
optional 是一种代码安全性检查机制,? 和 ! 给你足够的权限来决定一个变量什么时候可以为不确定值,什么时候必须为确定值。 个人还是很喜欢的。在编译阶段就能避免一些错误。
dorentus
2014-07-31 16:50:33 +08:00
3) let myValue: String 和 let myValue: String? 这两种声明的写法。前一种,编译器可以保证在任何时候 myValue 都一定是有值的,永远不会是 nil,假如没初始化,整个程序甚至都没法编译通过;而后一种,没有在其它地方初始化的话,myValue 的值就是 nil。

4 & 5) 你可以把 if let 当作是个语法糖……理解起来的话,以你的 if let actualNumber = possibleNumber.toInt() 为例,因为 if 的条件成立的话,actualNumber 必然不是 nil,于是编译器很智能,可以从这里直接推断出 actualNumber 的类型不再是 Int? 而是 Int。但是你分开写的话,编译器就不去试图做这个推断,于是 let convertedNumber = possibleNumber.toInt() 的 convertedNumber 的类型就是 Int? 而不是其它,用的时候就需要你自己去 unwrap。
dorentus
2014-07-31 17:03:51 +08:00
1 & 2) 大概是这样吧:

语言的设计者考察了语言的使用场景,发现有些时候变量是可以为空值的,但有些时候其实程序员是可以确定某变量是永远不会为空值的;后一种场景,语言里面没有对应的机制的话,无法让编译器知道这一点,于是不管是对于编译器还是对于程序员,都会很麻烦:编译器不敢做某些优化,程序员到处需要检查变量值是否为 nil。

于是,他们就把 Swift 设计成默认情况下,声明一个变量为某一类型之后,它(在它所属的类初始化之后)就必须有这个类型的值,否则算编译期错误。

然后因为实际中确实有情形要支持变量取空值,于是就提供了 Optional 来支持这个需求。
limon
2014-07-31 17:50:17 +08:00
nil你可能不去查,Optional强迫你去查,就是这样。和objc兼容也有关系。
palxex
2014-08-07 10:34:43 +08:00
本质上这是在一个静态类型语言在强行兼容动态类型语言返回值时补类型系统的漏用的。

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

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

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

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

© 2021 V2EX