V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
nagato
V2EX  ›  Swift

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

  •  
  •   nagato · 2014-07-31 15:04:06 +08:00 · 4406 次点击
    这是一个创建于 3768 天前的主题,其中的信息可能已经有所发展或是发生改变。
    首先,我表示在看完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 么。。。
    5 条回复    2014-08-07 10:34:43 +08:00
    headwindx
        1
    headwindx  
       2014-07-31 16:14:15 +08:00
    optional 是一种代码安全性检查机制,? 和 ! 给你足够的权限来决定一个变量什么时候可以为不确定值,什么时候必须为确定值。 个人还是很喜欢的。在编译阶段就能避免一些错误。
    dorentus
        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。
    dorentus
        3
    dorentus  
       2014-07-31 17:03:51 +08:00
    1 & 2) 大概是这样吧:

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

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

    然后因为实际中确实有情形要支持变量取空值,于是就提供了 Optional 来支持这个需求。
    limon
        4
    limon  
       2014-07-31 17:50:17 +08:00
    nil你可能不去查,Optional强迫你去查,就是这样。和objc兼容也有关系。
    palxex
        5
    palxex  
       2014-08-07 10:34:43 +08:00
    本质上这是在一个静态类型语言在强行兼容动态类型语言返回值时补类型系统的漏用的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2696 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 11:59 · PVG 19:59 · LAX 03:59 · JFK 06:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.