找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 156|回复: 0

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

[复制链接]

310

主题

0

回帖

956

积分

管理员

积分
956
发表于 2023-12-4 12:27:13 | 显示全部楼层 |阅读模式

貌似就是个 maybe monad 。真羡慕自带这种东西的语言。
let advertCount = self.cvsAdvertModel?.infos?.ref(0)?.imgs?.count ?? 0感受一下
@isweal 太烧脑子了
你不如花个 5 分钟仔细思考他们的区别 再写。。。。其实很简单
你要是用 rust ,写一大堆 match, unwrap, try!()就知道有多烦了。这是好东西
我一开始也挺烦这些的,现在用习惯了发现是神器啊比如这位兄弟提到的例子@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;}当然还有其他很多用法,理解下其实挺爽的
其实我就是懒,刚硬着头皮去看了 apple 的文档,有点开窍了。磨刀不误砍柴功,真理 https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/OptionalChaining.html
stackoverflow 上面有关于 optional 的解释,仔细看看,多读几遍,今天看不懂,明天继续看,总会看懂的,当初我也没明白,感觉傻逼一样的类型,用顺手之后,发现真的很好用!SOW 地址:http://stackoverflow.com/questions/24003642/what-is-an-optional-value-in-swift
这个挺好的呀。真的是个好东西
好用的语法糖,超甜
C#早就有了..
你是没看到 java 的 optional , 就算现在有了 optional 类型 还是惨不忍睹 超级难用
@zythum 我是觉得它可以设计的更友好一点,不要我去想着这是个 optional ,我要加?才行。要是编译器自己能自动判断最好了。
看起来 ruby 的?和!不同
推荐看这个 http://codon.com/refactoring-ruby-with-monads怎么把这个 简化成 怎么把这个 简化成 就知道 optional(monad)的作用了..
@zhuangzhuang1988 这个设计的好,不用加任何?和!,没心理负担
「不要我去想着这是个 optional ,我要加?才行」现在 Swift 3 里面 ! 表示 Implicitly Unwrapped Optional, 就是你想要的了。
新手觉得烦,老鸟觉得简直救命
反正别用强制解包(万恶之源 各种崩溃都和这玩意有关) 多写个 if let 。。。。
函数式语言的特性,用习惯了就爽!
data Optional = Some a | None个人感觉其实 a?.b?.c?? d 没太大的好处。。。def try(default=nil) begin yield rescue defaultend-->try(default) do a.b.c.d.eend也很好用呀~一个 CPS ,用在异步上配合自带 do-notation(haskell)/for(scala)语法才是正道=-=
@zhuangzhuang1988 Ruby2.0 可以这么写```ruby a&.b&.c&.d```2.0 以前可以这么写```rubya.try(:b).try(:c).try(:d)```
type?是个必要概念。type!,即 Implicitly Unwrapped Optional ,就是个语法糖。建议上手尽量用显示 unwrap 。variable!和 type!不一样,这个有时侯不得不用。
摘自 scala(swift 抄的多好就不说了)option[A] 一个容器,要么是 None 要么是 Some 。 Some 可以看作一个安全的 List 集 合,主要是安全,一些方法(foreach 、 filter)这样就不用判断是否为非空,在 匹配模式中使用 Some 就可以过滤掉为 None 的元素
我们组刚工作的开发都懂。虽然不懂 monad 啥的。
@jackisnotspirate 不错
这玩意儿 C++里面不是好多年前就有了。。 boost:ptional ?或者 Haskell 里面的 Maybe a = Just a | Nothing
来看看 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);
@wizardforcel 吐了
@ldehai Xcode 大多数情况会帮你自动加 不然会提醒你
@Perry 主要看着感觉不美观,多希望 swift 里把这两个符号给去掉
@Perry 有 warning ,不过你不加有时候写个 if else 的 null 的判断也行。。。。不过感觉还是没有?方便。。
不要使用 !不要使用 !不要使用 !
@webfrogs 你想说的是不要强制解包吧, Swift 3 里面 ! 有新变化
其实刚开始也不习惯但习惯了就是神器啊但如果出现像 self.cvsAdvertModel?.infos?.ref(0)?.imgs?.count ?? 0 这样的不妨去考虑一下 model 的结构不要弄的太深了原则是不要轻易使用‘!’多使用 if let a = xxx 或者 guard 语句代替
多使用 guard , swift 能做到这样类型安全已经很优秀了,理解了其实很简单,对比 OC ,才是一堆坑
真的花一点时间即可理解...
就是语法糖 Optional<T> ,不这样写的话,每一个 Optional 都得匹配一下,
用 "!" 强制解包你得 100% 确定这个值不为 nil ,否则得话用 "?" 加 "guard / if "判断一下。所以原则上不要轻易使用 "!"
也许是还没习惯的缘故,每次写的时候都很烧脑,一般都要依靠 Xcode 来更正不仅仅是打个?或!那么简单的,还有 as ? 、??、必须加括号后再加问号(xxx?.yyy) ?、 try !等等各种形式
@laoyur 有时候 Xcode 更正的是错的,还得自己改回去:(
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|鲜于璜碑

GMT+8, 2024-7-27 19:17 , Processed in 0.085223 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表