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

2016-09-27 11:47:08 +08:00
 ldehai
6168 次点击
所在节点    iDev
41 条回复
shyling
2016-09-27 16:44:43 +08:00
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
2016-09-27 16:46:46 +08:00
@zhuangzhuang1988 Ruby2.0 可以这么写
```ruby
a&.b&.c&.d
```

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

variable!和 type!不一样,这个有时侯不得不用。
fengmenggaokao
2016-09-27 18:12:21 +08:00
摘自 scala(swift 抄的多好就不说了)
option[A] 一个容器,要么是 None 要么是 Some 。 Some 可以看作一个安全的 List 集 合,主要是安全,一些方法(foreach 、 filter)这样就不用判断是否为非空,在 匹配模式中使用 Some 就可以过滤掉为 None 的元素
crashX
2016-09-27 18:38:26 +08:00
我们组刚工作的开发都懂。虽然不懂 monad 啥的。
ldehai
2016-09-27 19:45:11 +08:00
tairan2006
2016-09-27 21:09:59 +08:00
这玩意儿 C++里面不是好多年前就有了。。 boost::optional ?
或者 Haskell 里面的 Maybe a = Just a | Nothing
wizardforcel
2016-09-27 22:30:01 +08:00
来看看 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
2016-09-27 23:53:37 +08:00
@wizardforcel 吐了
Perry
2016-09-28 00:37:30 +08:00
@ldehai Xcode 大多数情况会帮你自动加 不然会提醒你
ldehai
2016-09-28 00:41:19 +08:00
@Perry 主要看着感觉不美观,多希望 swift 里把这两个符号给去掉
yjxjn
2016-09-28 09:54:35 +08:00
@Perry 有 warning ,不过你不加有时候写个 if else 的 null 的判断也行。。。。不过感觉还是没有?方便。。
webfrogs
2016-09-28 10:41:51 +08:00
不要使用 !
不要使用 !
不要使用 !
jackisnotspirate
2016-09-28 11:29:46 +08:00
@webfrogs 你想说的是不要强制解包吧, Swift 3 里面 ! 有新变化
yongSir
2016-09-28 16:21:08 +08:00
其实刚开始也不习惯
但习惯了就是神器啊

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

原则是不要轻易使用‘!’
多使用 if let a = xxx 或者 guard 语句代替
free9fw
2016-09-28 16:41:41 +08:00
多使用 guard , swift 能做到这样类型安全已经很优秀了,理解了其实很简单,对比 OC ,才是一堆坑
beordle
2016-09-28 19:18:01 +08:00
真的花一点时间即可理解...
sharpy
2016-09-30 15:58:04 +08:00
就是语法糖 Optional<T> ,不这样写的话,每一个 Optional 都得匹配一下,
iAugus
2016-10-18 00:42:46 +08:00
用 "!" 强制解包你得 100% 确定这个值不为 nil ,否则得话用 "?" 加 "guard / if "判断一下。所以原则上不要轻易使用 "!"
laoyur
2016-11-04 09:51:24 +08:00
也许是还没习惯的缘故,每次写的时候都很烧脑,一般都要依靠 Xcode 来更正
不仅仅是打个?或!那么简单的,还有 as ? 、??、必须加括号后再加问号(xxx?.yyy) ?、 try !等等各种形式

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/309245

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX