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

来源:互联网 发布:会员卡充值软件 编辑:程序博客网 时间:2024/05/16 10:42

谈到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 0
原创粉丝点击