1
headwindx 2014-07-31 16:14:15 +08:00
optional 是一种代码安全性检查机制,? 和 ! 给你足够的权限来决定一个变量什么时候可以为不确定值,什么时候必须为确定值。 个人还是很喜欢的。在编译阶段就能避免一些错误。
|
2
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。 |
3
dorentus 2014-07-31 17:03:51 +08:00
1 & 2) 大概是这样吧:
语言的设计者考察了语言的使用场景,发现有些时候变量是可以为空值的,但有些时候其实程序员是可以确定某变量是永远不会为空值的;后一种场景,语言里面没有对应的机制的话,无法让编译器知道这一点,于是不管是对于编译器还是对于程序员,都会很麻烦:编译器不敢做某些优化,程序员到处需要检查变量值是否为 nil。 于是,他们就把 Swift 设计成默认情况下,声明一个变量为某一类型之后,它(在它所属的类初始化之后)就必须有这个类型的值,否则算编译期错误。 然后因为实际中确实有情形要支持变量取空值,于是就提供了 Optional 来支持这个需求。 |
4
limon 2014-07-31 17:50:17 +08:00
nil你可能不去查,Optional强迫你去查,就是这样。和objc兼容也有关系。
|
5
palxex 2014-08-07 10:34:43 +08:00
本质上这是在一个静态类型语言在强行兼容动态类型语言返回值时补类型系统的漏用的。
|