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~~!
- swift中的可选类型的实现原理
- swift中的可选类型Optional?、解包!和隐式解包的可选类型的用法
- Swift可选类型的使用
- Swift:可选类型的含义
- Swift中的可选类型(Optional)以及?和!的用法详解
- Swift 中的可选类型(Optional)
- swift 可选类型的解包
- Swift学习 隐式解包的可选类型
- swift变量的可选(Optional)类型
- swift_010(Swift 的可选类型)
- swift语言-可选类型
- Swift:可选类型(Optional)
- Swift-Optional(可选类型?!)
- swift 之可选类型
- swift之可选类型
- Swift 可选类型 ?和!
- Swift 可选类型
- swift可选类型
- Activity理念(一个字头的诞生)
- C++中delete和delete[]的区别
- Java8 Lambda表达式教程
- MySQL查询本周一与本周日
- 数据库操作类
- swift中的可选类型的实现原理
- Android APK反编译 得到 代码 图片
- ZigZag Conversion
- Activity生命周期执行顺序
- Javascript笔记——什么是Javascript
- 7.消息传递
- 2016年6月10号
- 【CSS笔记三】CSS选择器
- Java设计模式之单例模式