swift中的可选类型的实现原理

谈到swift跟OC的不同,很多人第一个反应肯定是swift有可选类型,OC没有。
有一次跟人聊天的时候突然聊到swift的可选类型在API底层具体是如何实现的,当时并没有得到确切的答案。
可选类型的概念在C和Objective-C当中是不存在。Objective-C当中最相近的东西就是,一个返回对象类型的函数,可以返回nil.nil表示不存在一个有效的对象。但是,这个只适用于对象,对于结构体,基本的C类型,枚举,就不行了。对于这些类型,Objective-C的方法通常返回一个特殊值(比如NSNotFound)表示值的缺失。这种方法假设方法的调用者知道要返回一个特殊值来进行判断。
最近通过官方文档,和网上一些技术贴汇总一下
swift的可选类型,其实是一个枚举型,里面有None和Some两种类型,所谓的nil就是Optional.None,而非nil就是Optional.Some,然后通过Some(T)包装(wrap)原始值,当然有包装肯定要解包,所以在使用可选类型的时候要拆包,也就是从enum中取出来原始值,这里是官方enum Optional的定义:

enum Optional<T> : LogicValue, Reflectable {
    case None
    case Some(T)
    init()
    init(_ some: T)

    /// Allow use in a Boolean context.
    func getLogicValue() -> Bool

    /// Haskell's fmap, which was mis-named
    func map<U>(f: (T) -> U) -> U?
    func getMirror() -> Mirror
}

swift中可选类型还分为隐式可选类型和可选类型,
来看一下官方代码的解释:

let possibleString: String? = "An optional string."
println(possibleString!) // requires an exclamation mark to access its value
// prints "An optional string."

let assumedString: String! = "An implicitly unwrapped optional string."
println(assumedString) // no exclamation mark is needed to access its value

看不太懂哈哈,好像没什么实际的意义在里面,其实理解一下就是,当一个变量申明成可选类型的时候,他的值可能是nil&some,如果这个值是nil,而你调用这个变量的时候使用了!(强制拆包),上面提到,可选类型的根源是个枚举,而nil(Optional.None)是不需要拆包的,所以这个时候就会crash,如果这个值不是nil那么,用!(强制拆包)就是Optional.Some中取出了原始值,所以不会crash。
而如果申明一个变量是隐式可选类型如

let assumedString: String! = "An implicitly unwrapped optional string."

那么就说明这个变量是非nil的(因为是通过Optional.Some拆包出来的)。当将这个代码赋值成nil之后,再使用这个代码那么就当然的crash~~!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值