注册 登录
主题 : 吐槽 Swift的Optianal
级别: 新手上路
UID: 293546
精华: 0
发帖: 34
可可豆: 71 CB
威望: 61 点
在线时间: 76(时)
注册时间: 2014-02-19
最后登录: 2017-09-02
0 楼:  发表于: 2017-08-11 09:18    发自: Web Page

吐槽 Swift的Optianal   

The concept of optionals doesn’t exist in C or Objective-C. The nearest thing in Objective-C is the ability to return nil from a method that would otherwise return an object, with nil meaning “the absence of a valid object.” However, this only works for objects—it doesn’t work for structures, basic C types, or enumeration values. For these types, Objective-C methods typically return a special value (such as NSNotFound) to indicate the absence of a value. This approach assumes that the method’s caller knows there is a special value to test against and remembers to check for it. Swift’s optionals let you indicate the absence of a value for any type at all, without the need for special constants.
以上是苹果Swift编程文档里的介绍Opitional的一段


很明显,Optional 是为了解决像int, float 等非指针变量的无值而设计的一种特性
也就是说,你在使用一个optional的变量时,依然要去检查这个变量是否是nil,如果不是nil,再在使用的时候用!来unwrap这个optional变量来取他内部的值。
swift还为此发明了一种特殊的if语句,如下
[pre]let found = find();
if let content = found { 
 print("found: " + content)
}
[/pre]
这里find()返回的是optional的值, 即found是optional的,if语句里定义了content变量,content不是optional的,即if语句会检查found是否是nil,如果是nil,跳过括号里的语句,如果不是,unwrap found并付值content。如果你不判断found是不是nil,而是直接unwrap,则会报错。
所以,它仅仅解决的是非指针类型的无值问题。
而为了这个问题,不管指针非指针,你写代码的时候,都得加上丑陋的?来声明这个变脸为optional。
在某些情况下,你没办法在代码里给出初始值,只能声明成optional的, 别无选择,wtf
然后在你每次使用的时候,都得用丑陋的“!”来unwrap, 这得多写多少个“!”啊?

optional解决一个问题,却引入了其他的问题,哎
就不能张点心吗,解决问题的同时,别引入别的问题啊


[ 此帖被wy001在2017-08-11 09:55重新编辑 ]

级别: 版主

状态: 连续签到 - [82天]
UID: 519631
精华: 0
发帖: 733
可可豆: 1607 CB
威望: 1049 点
在线时间: 1423(时)
注册时间: 2015-11-02
最后登录: 2017-10-20
1 楼:  发表于: 2017-08-11 09:33    发自: Web Page
如果你能保证某个属性后面一定有值的话,可以声明为-->属性!

一切为了安全吧
级别: 新手上路
UID: 293546
精华: 0
发帖: 34
可可豆: 71 CB
威望: 61 点
在线时间: 76(时)
注册时间: 2014-02-19
最后登录: 2017-09-02
2 楼:  发表于: 2017-08-11 09:47    发自: Web Page
引用
引用第1楼ad0ma于2017-08-11 09:33发表的  :
如果你能保证某个属性后面一定有值的话,可以声明为-->属性!

一切为了安全吧




根本不是安全的事啊
一个optional的变量,你不判断,直接用!来unwrap,是nil的话就出错了啊,写代码时可不会提示你没判断nil啊,对吧?

再者,有时候根本没法保证里面到底有没有值啊,必须判断是不是nil啊,所以必须声明成optional的。。别无选择
级别: 新手上路
状态: 连续签到 - [30天]
UID: 554992
精华: 0
发帖: 33
可可豆: 266 CB
威望: 181 点
在线时间: 53(时)
注册时间: 2016-04-03
最后登录: 2017-10-08
3 楼:  发表于: 2017-08-11 14:49    发自: Web Page
确实有点烦,整天!,as ,?什么的。比起其它语言的需要自己进行判断还麻烦。
级别: 骑士
状态: 连续签到 - [153天]
UID: 520498
精华: 0
发帖: 293
可可豆: 1173 CB
威望: 852 点
在线时间: 548(时)
注册时间: 2015-11-04
最后登录: 2017-10-20
4 楼:  发表于: 2017-08-11 15:01    发自: Web Page
你想要不那么烦的话,在数据层获取数据时就可以用??给一个默认值,那么接受这些数据的对象就不会存在optional的可能

我只会不懂装懂
描述
快速回复

关注本帖(如果有新回复会站内信通知您)

发帖、回帖都会得到可观的积分奖励。查看论坛积分规则

按"Ctrl+Enter"直接提交
    顶部