怎么理解 Optionals,个人觉得多此一举啊 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
nagato
V2EX    Swift

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

  •  
  •   nagato 2014-07-31 15:04:06 +08:00 4660 次点击
    这是一个创建于 4092 天前的主题,其中的信息可能已经有所发展或是发生改变。
    首先,我表示在看完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     Solana     3733 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 30ms UTC 00:44 PVG 08:44 LAX 17:44 JFK 20:44
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86