1
ChefIsAwesome 2016 年 9 月 27 日
貌似就是个 maybe monad 。真羡慕自带这种东西的语言。
|
2
isweal 2016 年 9 月 27 日
let advertCount = self.cvsAdvertModel?.infos?.ref(0)?.imgs?.count ?? 0
感受一下 |
4
xiaoc19 2016 年 9 月 27 日 你不如花个 5 分钟仔细思考他们的区别 再写。。。。
其实很简单 |
5
congeec 2016 年 9 月 27 日 via iPhone 你要是用 rust ,写一大堆 match, unwrap, try!()就知道有多烦了。这是好东西
|
6
kera0a 2016 年 9 月 27 日 我一开始也挺烦这些的,现在用习惯了发现是神器啊
比如这位兄弟提到的例子 @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; } 当然还有其他很多用法,理解下其实挺爽的 |
7
ldehai OP 其实我就是懒,刚硬着头皮去看了 apple 的文档,有点开窍了。磨刀不误砍柴功,真理 https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/OptionalChaining.html
|
8
yjxjn 2016 年 9 月 27 日 stackoverflow 上面有关于 optional 的解释,仔细看看,多读几遍,今天看不懂,明天继续看,总会看懂的,当初我也没明白,感觉傻逼一样的类型,用顺手之后,发现真的很好用!
SOW 地址: http://stackoverflow.com/questions/24003642/what-is-an-optional-value-in-swift |
9
zythum 2016 年 9 月 27 日
这个挺好的呀。真的是个好东西
|
10
zacard 2016 年 9 月 27 日
好用的语法糖,超甜
|
11
zhuangzhuang1988 2016 年 9 月 27 日
C#早就有了..
|
12
Troevil 2016 年 9 月 27 日
你是没看到 java 的 optional , 就算现在有了 optional 类型 还是惨不忍睹 超级难用
|
14
subpo 2016 年 9 月 27 日
看起来 ruby 的?和!不同
|
15
zhuangzhuang1988 2016 年 9 月 27 日
|
16
ldehai OP @zhuangzhuang1988 这个设计的好,不用加任何?和!,没心理负担
|
17
jackisnotspirate 2016 年 9 月 27 日 「不要我去想着这是个 optional ,我要加?才行」现在 Swift 3 里面 ! 表示 Implicitly Unwrapped Optional, 就是你想要的了。
|
18
tabris17 2016 年 9 月 27 日
新手觉得烦,老鸟觉得简直救命
|
19
xjbeta 2016 年 9 月 27 日
反正别用强制解包(万恶之源 各种崩溃都和这玩意有关) 多写个 if let 。。。。
|
20
littleshy 2016 年 9 月 27 日
函数式语言的特性,用习惯了就爽!
|
21
shyling 2016 年 9 月 27 日
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)语法才是正道=-= |
22
freshfish 2016 年 9 月 27 日
|
23
shimanooo 2016 年 9 月 27 日
type?是个必要概念。
type!,即 Implicitly Unwrapped Optional ,就是个语法糖。 建议上手尽量用显示 unwrap 。 variable!和 type!不一样,这个有时侯不得不用。 |
24
fengmenggaokao 2016 年 9 月 27 日
摘自 scala(swift 抄的多好就不说了)
option[A] 一个容器,要么是 None 要么是 Some 。 Some 可以看作一个安全的 List 集 合,主要是安全,一些方法(foreach 、 filter)这样就不用判断是否为非空,在 匹配模式中使用 Some 就可以过滤掉为 None 的元素 |
25
crashX 2016 年 9 月 27 日
我们组刚工作的开发都懂。虽然不懂 monad 啥的。
|
26
ldehai OP @jackisnotspirate 不错
|
27
tairan2006 2016 年 9 月 27 日
这玩意儿 C++里面不是好多年前就有了。。 boost::optional ?
或者 Haskell 里面的 Maybe a = Just a | Nothing |
28
wizardforcel 2016 年 9 月 27 日
来看看 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); |
29
ldehai OP @wizardforcel 吐了
|
33
webfrogs 2016 年 9 月 28 日
不要使用 !
不要使用 ! 不要使用 ! |
34
jackisnotspirate 2016 年 9 月 28 日
@webfrogs 你想说的是不要强制解包吧, Swift 3 里面 ! 有新变化
|
35
yongSir 2016 年 9 月 28 日
其实刚开始也不习惯
但习惯了就是神器啊 但如果出现像 self.cvsAdvertModel?.infos?.ref(0)?.imgs?.count ?? 0 这样的 不妨去考虑一下 model 的结构 不要弄的太深了 原则是不要轻易使用‘!’ 多使用 if let a = xxx 或者 guard 语句代替 |
36
free9fw 2016 年 9 月 28 日
多使用 guard , swift 能做到这样类型安全已经很优秀了,理解了其实很简单,对比 OC ,才是一堆坑
|
37
beordle 2016 年 9 月 28 日
真的花一点时间即可理解...
|
38
sharpy 2016 年 9 月 30 日
就是语法糖 Optional<T> ,不这样写的话,每一个 Optional 都得匹配一下,
|
39
iAugus 2016 年 10 月 18 日
用 "!" 强制解包你得 100% 确定这个值不为 nil ,否则得话用 "?" 加 "guard / if "判断一下。所以原则上不要轻易使用 "!"
|
40
laoyur 2016 年 11 月 4 日
也许是还没习惯的缘故,每次写的时候都很烧脑,一般都要依靠 Xcode 来更正
不仅仅是打个?或!那么简单的,还有 as ? 、??、必须加括号后再加问号(xxx?.yyy) ?、 try !等等各种形式 |