iOS 开发实用技术导航
NSHipster 中文版
› http://nshipster.cn/
cocos2d 开源 2D 游戏引擎
› http://www.cocos2d-iphone.org/
CocoaPods
› http://cocoapods.org/
Google Analytics for Mobile 统计解决方案
› http://code.google.com/mobile/analytics/
WWDC
› https://developer.apple.com/wwdc/
Design Guides and Resources
› https://developer.apple.com/design/
Transcripts of WWDC sessions
› http://asciiwwdc.com
Cocoa with Love
› http://cocoawithlove.com/
Cocoa Dev Central
› http://cocoadevcentral.com/
NSHipster
› http://nshipster.com/
Style Guides
› Google Objective-C Style Guide
› NYTimes Objective-C Style Guide
Useful Tools and Services
› Charles Web Debugging Proxy
› Smore
ldehai
V2EX  ›  iDev

Swift optional 类型真烦,写了一个月 swift 了还有点搞不清?和!

  •  
  •   ldehai ·
    ldehai · Sep 27, 2016 · 7464 views
    This topic created in 3696 days ago, the information mentioned may be changed or developed.
    41 replies  •  2016-11-04 11:01:52 +08:00
    ChefIsAwesome
    ChefIsAwesome
    Sep 27, 2016
    1
    貌似就是个 maybe monad 。真羡慕自带这种东西的语言。
    isweal
    isweal
    Sep 27, 2016
    2
    let advertCount = self.cvsAdvertModel?.infos?.ref(0)?.imgs?.count ?? 0
    感受一下
    ldehai
    ldehai
    OP
    Sep 27, 2016
    3
    @isweal 太烧脑子了
    xiaoc19
    xiaoc19
    Sep 27, 2016❤️1
    4
    你不如花个 5 分钟仔细思考他们的区别 再写。。。。
    其实很简单
    congeec
    congeec
    Sep 27, 2016 via iPhone❤️1
    5
    你要是用 rust ,写一大堆 match, unwrap, try!()就知道有多烦了。这是好东西
    kera0a
    kera0a
    Sep 27, 2016❤️1
    6
    我一开始也挺烦这些的,现在用习惯了发现是神器啊
    比如这位兄弟提到的例子
    @isweal
    let advertCount = self.cvsAdvertModel?.infos?.ref(0)?.imgs?.count ?? 0

    如果没有 optional ,取 advertCount 要这样
    if(self.cvsAdvertModel != nil ){
    if( ...infos? != nil){
    if( ...ref(0) != nil ){
    if
    if
    }
    }
    }

    而 optional 写法
    if let advertCount = self.cvsAdvertModel?.infos?.ref(0)?.imgs?.count {

    }
    else{
    let advertCount = 0;
    }

    当然还有其他很多用法,理解下其实挺爽的
    ldehai
    ldehai
    OP
    Sep 27, 2016
    7
    其实我就是懒,刚硬着头皮去看了 apple 的文档,有点开窍了。磨刀不误砍柴功,真理 https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/OptionalChaining.html
    yjxjn
    yjxjn
    Sep 27, 2016❤️1
    8
    stackoverflow 上面有关于 optional 的解释,仔细看看,多读几遍,今天看不懂,明天继续看,总会看懂的,当初我也没明白,感觉傻逼一样的类型,用顺手之后,发现真的很好用!
    SOW 地址:
    http://stackoverflow.com/questions/24003642/what-is-an-optional-value-in-swift
    zythum
    zythum
    Sep 27, 2016
    9
    这个挺好的呀。真的是个好东西
    zacard
    zacard
    Sep 27, 2016
    10
    好用的语法糖,超甜
    zhuangzhuang1988
    zhuangzhuang1988
    Sep 27, 2016
    11
    C#早就有了..
    Troevil
    Troevil
    Sep 27, 2016
    12
    你是没看到 java 的 optional , 就算现在有了 optional 类型 还是惨不忍睹 超级难用
    ldehai
    ldehai
    OP
    Sep 27, 2016
    13
    @zythum 我是觉得它可以设计的更友好一点,不要我去想着这是个 optional ,我要加?才行。要是编译器自己能自动判断最好了。
    subpo
    subpo
    Sep 27, 2016
    14
    看起来 ruby 的?和!不同
    zhuangzhuang1988
    zhuangzhuang1988
    Sep 27, 2016
    15
    推荐看这个 http://codon.com/refactoring-ruby-with-monads
    怎么把
    这个

    简化成


    怎么把
    这个

    简化成


    就知道 optional(monad)的作用了..
    ldehai
    ldehai
    OP
    Sep 27, 2016
    16
    @zhuangzhuang1988 这个设计的好,不用加任何?和!,没心理负担
    jackisnotspirate
    jackisnotspirate
    Sep 27, 2016❤️1
    17
    「不要我去想着这是个 optional ,我要加?才行」现在 Swift 3 里面 ! 表示 Implicitly Unwrapped Optional, 就是你想要的了。
    tabris17
    tabris17
    Sep 27, 2016
    18
    新手觉得烦,老鸟觉得简直救命
    xjbeta
    xjbeta
    Sep 27, 2016
    19
    反正别用强制解包(万恶之源 各种崩溃都和这玩意有关) 多写个 if let 。。。。
    littleshy
    littleshy
    Sep 27, 2016
    20
    函数式语言的特性,用习惯了就爽!
    shyling
    shyling
    Sep 27, 2016
    21
    data Optional = Some a
    | None

    个人感觉其实 a?.b?.c?? d 没太大的好处。。。
    def try(default=nil)
    begin
    yield
    rescue
    default
    end
    -->
    try(default) do
    a.b.c.d.e
    end
    也很好用呀~
    一个 CPS ,用在异步上配合自带 do-notation(haskell)/for(scala)语法才是正道=-=
    freshfish
    freshfish
    Sep 27, 2016
    22
    @zhuangzhuang1988 Ruby2.0 可以这么写
    ```ruby
    a&.b&.c&.d
    ```

    2.0 以前可以这么写
    ```ruby
    a.try(:b).try(:c).try(:d)
    ```
    shimanooo
    shimanooo
    Sep 27, 2016
    23
    type?是个必要概念。
    type!,即 Implicitly Unwrapped Optional ,就是个语法糖。
    建议上手尽量用显示 unwrap 。

    variable!和 type!不一样,这个有时侯不得不用。
    fengmenggaokao
    fengmenggaokao
    Sep 27, 2016
    24
    摘自 scala(swift 抄的多好就不说了)
    option[A] 一个容器,要么是 None 要么是 Some 。 Some 可以看作一个安全的 List 集 合,主要是安全,一些方法(foreach 、 filter)这样就不用判断是否为非空,在 匹配模式中使用 Some 就可以过滤掉为 None 的元素
    crashX
    crashX
    Sep 27, 2016
    25
    我们组刚工作的开发都懂。虽然不懂 monad 啥的。
    ldehai
    ldehai
    OP
    Sep 27, 2016
    26
    keenkiller
    keenkiller
    Sep 27, 2016
    27
    这玩意儿 C++里面不是好多年前就有了。。 boost::optional ?
    或者 Haskell 里面的 Maybe a = Just a | Nothing
    wizardforcel
    wizardforcel
    Sep 27, 2016
    28
    来看看 java 版的:

    advertCount = Optional.of(self).map(o -> o.cvsAdvertModel).map(o -> o.infos).map(o -> o.ref(0)).map(o -> o.imgs).map(o -> o.count).orElse(0);
    ldehai
    ldehai
    OP
    Sep 27, 2016
    29
    @wizardforcel 吐了
    Perry
    Perry
    Sep 28, 2016 via iPhone
    30
    @ldehai Xcode 大多数情况会帮你自动加 不然会提醒你
    ldehai
    ldehai
    OP
    Sep 28, 2016
    31
    @Perry 主要看着感觉不美观,多希望 swift 里把这两个符号给去掉
    yjxjn
    yjxjn
    Sep 28, 2016
    32
    @Perry 有 warning ,不过你不加有时候写个 if else 的 null 的判断也行。。。。不过感觉还是没有?方便。。
    webfrogs
    webfrogs
    Sep 28, 2016
    33
    不要使用 !
    不要使用 !
    不要使用 !
    jackisnotspirate
    jackisnotspirate
    Sep 28, 2016
    34
    @webfrogs 你想说的是不要强制解包吧, Swift 3 里面 ! 有新变化
    yongSir
    yongSir
    Sep 28, 2016
    35
    其实刚开始也不习惯
    但习惯了就是神器啊

    但如果出现像 self.cvsAdvertModel?.infos?.ref(0)?.imgs?.count ?? 0 这样的
    不妨去考虑一下 model 的结构
    不要弄的太深了

    原则是不要轻易使用‘!’
    多使用 if let a = xxx 或者 guard 语句代替
    free9fw
    free9fw
    Sep 28, 2016
    36
    多使用 guard , swift 能做到这样类型安全已经很优秀了,理解了其实很简单,对比 OC ,才是一堆坑
    beordle
    beordle
    Sep 28, 2016
    37
    真的花一点时间即可理解...
    sharpy
    sharpy
    Sep 30, 2016
    38
    就是语法糖 Optional<T> ,不这样写的话,每一个 Optional 都得匹配一下,
    iAugus
    iAugus
    Oct 18, 2016
    39
    用 "!" 强制解包你得 100% 确定这个值不为 nil ,否则得话用 "?" 加 "guard / if "判断一下。所以原则上不要轻易使用 "!"
    laoyur
    laoyur
    Nov 4, 2016
    40
    也许是还没习惯的缘故,每次写的时候都很烧脑,一般都要依靠 Xcode 来更正
    不仅仅是打个?或!那么简单的,还有 as ? 、??、必须加括号后再加问号(xxx?.yyy) ?、 try !等等各种形式
    ldehai
    ldehai
    OP
    Nov 4, 2016
    41
    @laoyur 有时候 Xcode 更正的是错的,还得自己改回去:(
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   4181 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 74ms · UTC 09:25 · PVG 17:25 · LAX 01:25 · JFK 04:25
    ♥ Do have faith in what you're doing.