Swift-Optional(可选类型?!)
2015-08-18 11:32
330 查看
使用可选类型(optionals)来处理值可能缺失的情况
C和Objective-C中没有可选类型这个概念。最接近的是Objective-C中的一个方法要么返回一个对象要不返回nil,nil表示”缺少一个合法的对象“。然而这只作用于对象,对于结构体,基本的C类型或者枚举类型不起作用。对于这些类型,Objective-C方法一般会返回一个特殊值(NSNotFound)来暗示值缺失。这种方法假设方法的调用者知道并记得特殊值进行判断。然而Swift的可选类型可以让你暗示任意类型值的缺失,并不需要一个特殊值
Swift中的nil和objective-C中的nil并不一样,在Objective-C中,nil是一个指向不存在的对象的指针,在Swift中,nil不是指针,而是一个确定的值用来表示值缺失。任何类型的可选状态都可以被设置为nil,不只是对象类型
可选类型声明
这两种类型的声明是一样的,其实Optional是一个枚举值,包含了两个元素None、Some,可以理解为,这是一个Optional类型的值,要么包含一个String类型的值(Optional.Some)要么就是nil(Optional.None)
使用
一个Optional类型的值是没有办法对其直接操作的,例如上面的声明,
怎么使用Optional类型的值?如果不确定该值是否为nil,那在直接操作的时候需要加上”?”,如果为nil,则不继续下一步操作,如果不为nil,则强制拆包执行后续操作(例如方法)
if语句强制解析
let anum = aStr!.toInt()当直接对可选类型进行强制解析(拆包),你必须确定,200%的确定该值一定不能为nil,否则在运行时会有发生Crash的风险。因此为了安全使用if语句
在上面语句中”!”的意思是确定该可选类型有值,可以使用
可选绑定(Optional binding)
使用可选绑定来判断可选类型是否包含值,如果包含就把值赋给一个临时变量或者常量。可选绑定可以用在if和while语句中来对可选类型的值进行判断。
隐式解析可选类型
可选类型暗示了常量或者变量可以没有值(nil)。如果在程序架构中,第一次被赋值之后可以确定一个可选类型总是有值,如果每次都要判断和解析可选值的效率是很低的,因为可以确定它总是有值的。所以引入了隐式解析可选类型(implicity unwrapped optionals),在声明可选类型的时候将”?”改成”!”
总结:使用”?”的场景:
1.声明Optional值变量
2.用于安全调用protocol的optional方法
3.使用 as? 向下转型
使用”!”的场景:
1.隐式解析可选类型的声明
2.强制对Optional类型的值拆包
引用:《The Swift Programming Language》
如有问题欢迎指正,谢谢
C和Objective-C中没有可选类型这个概念。最接近的是Objective-C中的一个方法要么返回一个对象要不返回nil,nil表示”缺少一个合法的对象“。然而这只作用于对象,对于结构体,基本的C类型或者枚举类型不起作用。对于这些类型,Objective-C方法一般会返回一个特殊值(NSNotFound)来暗示值缺失。这种方法假设方法的调用者知道并记得特殊值进行判断。然而Swift的可选类型可以让你暗示任意类型值的缺失,并不需要一个特殊值
Swift中的nil和objective-C中的nil并不一样,在Objective-C中,nil是一个指向不存在的对象的指针,在Swift中,nil不是指针,而是一个确定的值用来表示值缺失。任何类型的可选状态都可以被设置为nil,不只是对象类型
可选类型声明
var aStr :String? var bStr :Optional<String>
这两种类型的声明是一样的,其实Optional是一个枚举值,包含了两个元素None、Some,可以理解为,这是一个Optional类型的值,要么包含一个String类型的值(Optional.Some)要么就是nil(Optional.None)
使用
一个Optional类型的值是没有办法对其直接操作的,例如上面的声明,
let anum = aStr.toInt()
怎么使用Optional类型的值?如果不确定该值是否为nil,那在直接操作的时候需要加上”?”,如果为nil,则不继续下一步操作,如果不为nil,则强制拆包执行后续操作(例如方法)
if语句强制解析
let anum = aStr!.toInt()当直接对可选类型进行强制解析(拆包),你必须确定,200%的确定该值一定不能为nil,否则在运行时会有发生Crash的风险。因此为了安全使用if语句
if aStr != nil { let b = aStr!.toInt() }
在上面语句中”!”的意思是确定该可选类型有值,可以使用
可选绑定(Optional binding)
使用可选绑定来判断可选类型是否包含值,如果包含就把值赋给一个临时变量或者常量。可选绑定可以用在if和while语句中来对可选类型的值进行判断。
if let c = aStr { let b = aStr!.toInt() }
隐式解析可选类型
可选类型暗示了常量或者变量可以没有值(nil)。如果在程序架构中,第一次被赋值之后可以确定一个可选类型总是有值,如果每次都要判断和解析可选值的效率是很低的,因为可以确定它总是有值的。所以引入了隐式解析可选类型(implicity unwrapped optionals),在声明可选类型的时候将”?”改成”!”
var aStr :String! let anum = aStr.toInt()
可以把隐式解析可选类型当做是一个可以自动解析的可选类型,如果没有给隐式解析可选类型赋值就尝试这取值,会发生Crash,和可选类型直接使用”!”取值一样
总结:使用”?”的场景:
1.声明Optional值变量
2.用于安全调用protocol的optional方法
3.使用 as? 向下转型
使用”!”的场景:
1.隐式解析可选类型的声明
2.强制对Optional类型的值拆包
引用:《The Swift Programming Language》
如有问题欢迎指正,谢谢
相关文章推荐
- Apple Swift学习教程
- Swift中实现点击、双击、捏、旋转、拖动、划动、长按手势的类和方法介绍
- Swift中定义二维数组的方法及遍历方法示例
- 简单分析Swift语言的一些基本特征
- Swift与C语言指针结合使用实例
- Swift心得笔记之控制流
- Java函数式编程(六):Optional
- 用Swift构建一个简单的iOS邮件应用的方法
- 苹果公司推出的新编程语言Swift简介和入门教程
- Swift中的指针操作和使用详细介绍
- Swift中使用正则表达式的一些方法
- Swift心得笔记之运算符
- Swift中使用可选类型完美解决占位问题
- Swift学习笔记之构造器重载
- Swift中的Access Control权限控制介绍
- Swift类型创建之自定义一个类型详解
- Swift教程之控制流详解
- Swift中初始化方法的顺序介绍
- 秒学Swift开发语言