可选型(optional)
2015-11-25 17:06
267 查看
一个值,可能有值,也可能为nil,存在不确定性,即为可选型。
如上,possibleNumber的值不一定能够转换成功,如果possibleNumber为字符或者字符串,则convertedNumber的值为nil,因此,possibleNumber为可选值
可选型的声明如下:
let possibleNumber : Int?
如果确认可选型的值不为nil,那么可以使用解包(!)的方式,获取它的值,如下:
我们为可选型的possibleNumber赋值为1,那么此时判断可选型不为nil,即可解包获取possibleNumber的值
可选绑定(optional binding)
使用可选绑定来判断可选值是否有值,如果有值,则赋给该值。
所谓的可选绑定,就是把可选型赋给一个变量或者常量,如果赋值后需要改变该值,则需要赋值给变量,否则赋给常量。如下
可以包含多个可选绑定在if语句中,并使用where子句做布尔值判断。
隐式解析可选
如上,可选暗示了常量或者变量可以为“nil”。
可选可以通过if来判断是否有值,如果有值,可以通过解包或者可选绑定来解析值。
有时候,在程序中,可选被第一次赋值后,可以确定为一个总有值的可选。但是每次都要判断和解析,则是非常低效的。因此,有一种类型被定义为:隐式解析可选(implicitly unwrapped optionals),不需要每次都解析,但是仍需要判断是否有值。因为隐式解析可选,如果没有值的情况下取值,会引发运行时异常。具体办法看后面的两种解决方式。
注意:如果在隐式解析可选没有值的情况下尝试取值,会触发运行时错误。(顺带,如果在普通解析可选没有值的情况下,取值时加上!,也会触发错误)因此,有以下两种解决方法:
注意:
1、你可以把隐式解析可选当做是一个自动解析的可选,只是把解析的感叹号放到类型的末尾,而不是每次解包的时候放到可选名字的后面。
2、swift中的nil和objective-c中的nil并不一样。在objective-c中,nil是一个指向不存在对象的指针。在swift中,nil不是指针,它是一个确定的值,用来表示值缺失,任何类型的可选都可以被设置为nil,不只是对象类型。
3、一个变量如果之后可能变为nil的话,不要使用隐式解析可选。如果需要在变量的生命周期中判断是否是nil的话,使用普通可选类型。(意思就是说,不要瞎费劲,根据实际情况选择解析可选的类型)。
4、当可选被第一次赋值之后一直有值的时候,隐式解析可选非常有用。隐式解析主要被用在swift中类的构造过程中,具体后面我在补充。
let possibleNumber = “三” let convertedNumber = Int(possibleNumber)//nil let possibleNumber2 = “123” let convertedNumber2 = Int(possibleNumber2)//123
如上,possibleNumber的值不一定能够转换成功,如果possibleNumber为字符或者字符串,则convertedNumber的值为nil,因此,possibleNumber为可选值
可选型的声明如下:
let possibleNumber : Int?
如果确认可选型的值不为nil,那么可以使用解包(!)的方式,获取它的值,如下:
possibleNumber=1 if possibleNumber != nil{ print("possibleNumber不为空,值为:\(possibleNumber!)") }
我们为可选型的possibleNumber赋值为1,那么此时判断可选型不为nil,即可解包获取possibleNumber的值
可选绑定(optional binding)
使用可选绑定来判断可选值是否有值,如果有值,则赋给该值。
所谓的可选绑定,就是把可选型赋给一个变量或者常量,如果赋值后需要改变该值,则需要赋值给变量,否则赋给常量。如下
let possibleNumber : Int? possibleNumber = nil if let actualNumber = possibleNumber{ print("可选型的值为:\(actualNumber)") }else{ print("可选型的值为:nil") }
可以包含多个可选绑定在if语句中,并使用where子句做布尔值判断。
if let firstNumber = Int("4"),secondNumber = Int("42") where firstNumber < secondNumber { print("\(firstNumber)<\(secondNumber)") }
隐式解析可选
如上,可选暗示了常量或者变量可以为“nil”。
可选可以通过if来判断是否有值,如果有值,可以通过解包或者可选绑定来解析值。
有时候,在程序中,可选被第一次赋值后,可以确定为一个总有值的可选。但是每次都要判断和解析,则是非常低效的。因此,有一种类型被定义为:隐式解析可选(implicitly unwrapped optionals),不需要每次都解析,但是仍需要判断是否有值。因为隐式解析可选,如果没有值的情况下取值,会引发运行时异常。具体办法看后面的两种解决方式。
//普通解析可选 var possibleString : String? = "普通解析可选" print("字符串:\(possibleString!)")
//隐式解析可选 var possibleString2 : String! = "隐式解析可选" print("字符串:\(possibleString2)")
注意:如果在隐式解析可选没有值的情况下尝试取值,会触发运行时错误。(顺带,如果在普通解析可选没有值的情况下,取值时加上!,也会触发错误)因此,有以下两种解决方法:
//判断是否为空 var possibleString3 : String! if possibleString3 != nil{ print("隐式解析可选,值为:\(possibleString3)") }else{ print("隐式解析可选,值为:nil") }
//通过可选绑定判断是否为空 possibleString3 = "隐式解析可选有值" if let possible = possibleString3{ print("隐式解析可选:\(possibleString3)") }else{ print("隐式解析可选,值为:nil") }
注意:
1、你可以把隐式解析可选当做是一个自动解析的可选,只是把解析的感叹号放到类型的末尾,而不是每次解包的时候放到可选名字的后面。
2、swift中的nil和objective-c中的nil并不一样。在objective-c中,nil是一个指向不存在对象的指针。在swift中,nil不是指针,它是一个确定的值,用来表示值缺失,任何类型的可选都可以被设置为nil,不只是对象类型。
3、一个变量如果之后可能变为nil的话,不要使用隐式解析可选。如果需要在变量的生命周期中判断是否是nil的话,使用普通可选类型。(意思就是说,不要瞎费劲,根据实际情况选择解析可选的类型)。
4、当可选被第一次赋值之后一直有值的时候,隐式解析可选非常有用。隐式解析主要被用在swift中类的构造过程中,具体后面我在补充。
相关文章推荐
- Apple Swift学习教程
- Swift中实现点击、双击、捏、旋转、拖动、划动、长按手势的类和方法介绍
- Swift编程中的泛型解析
- Swift中定义二维数组的方法及遍历方法示例
- 简单分析Swift语言的一些基本特征
- Swift与C语言指针结合使用实例
- Swift心得笔记之控制流
- Java函数式编程(六):Optional
- 用Swift构建一个简单的iOS邮件应用的方法
- 苹果公司推出的新编程语言Swift简介和入门教程
- Swift中的指针操作和使用详细介绍
- Swift中使用正则表达式的一些方法
- Swift心得笔记之运算符
- Swift中使用可选类型完美解决占位问题
- Swift学习笔记之构造器重载
- Swift中的Access Control权限控制介绍
- Swift类型创建之自定义一个类型详解
- Swift教程之控制流详解
- Swift中初始化方法的顺序介绍