【Swift】Optionals and Optionals Banding
今天学习Swift 的时候,接触到了Optionals(可选项)这个概念,之后进行StringToInt强制类型转换时,被Swift的**加叹号!进行强转**的这个特性逗笑了,哈哈,非常Swift:
1 | let possibleNumber = "123" |
- 什么是可选项?
- 可选项用来处理可能缺失的情况,比如String转Int
- 情况一:存在一个值(不一定是数字),可以打开optinals去访问。即这个值等于x,你可以通过转化为optionals访问使用。比如在Switch语句中,case后面的值,就是一个可选项,它可能存在并且等于某个值,也可能不存在
- 情况二:这个值不存在。比如,一个String变量中不表示为一个数字,强转后为nil,并且这个String变量无法被部分识别出整型变量,具体如下代码:
1
2
3
4
5
6
7
8
9
10let possibleNumber2 = "ALL IS STRING"
let convertedNumber2 = Int(possibleNumber2)
// 纯String转化为Int即为nil
print("Converted Number 2 is \(convertedNumber2)")
let possibleNumber3 = " 2333 NOT ALL IS STRING 2333"
let convertedNumber3 = Int(possibleNumber3)
// 无法部分识别String变量中的数字,仍为nil
print("Converted Number 3 is \(convertedNumber3)")
- 什么是可选项绑定(Option Binding)?
- 因为可选项是可能有,可能没有的值。在实际应用中,很可能会遇到需要根据可选项的值是否存在,来进行逻辑判断的的情况。此时,我们就可以使用可选项绑定(Option Binding)的方法来获取可选项里面的值:
- 形式:
constantName = someOptional
,顾名思义,就是把Option绑定到一个固定的值 - 和 if、while结合使用,可以检查可选项内部的值,并把它赋值给一个变量或常量
1
2
3if let constantName = someOptional {
statements
}
- 什么是隐式展开可选项(Implicitly Unwrapped Optionals)?
- 在有些程序结构中,可选项被设定值之后,就会一直拥有值,继而可以去掉检查的需求,也不必每次访问都进行展开(Unwrapped),因为它可以安全地确认每次访问的时候都有一个值
- 此时,这种类型的可选项可定义为隐式展开可选项(Implicitly Unwrapped Optionals)
- 通过在声明的类型后面添加一个叹号(String!)而非问好(String?)来书写隐式展开可选项。
- 隐式展开可选项主要被用在Swift类的初始化进程中,即可选项被定义的时候就能立即确认其中有值的情况下
- eg. 在访问被明确为 String 的可选项展开值时,可选字符串和隐式展开可选字符串的行为区别:
1
2
3
4
5
6
let possibleString: String? = "An optional string."
let forcedString: String = possibleString! // requires an exclamation mark
let assumedString: String! = "An implicitly unwrapped optional string."
let implicitString: String = assumedString // no need for an exclamation mark
- 在有些程序结构中,可选项被设定值之后,就会一直拥有值,继而可以去掉检查的需求,也不必每次访问都进行展开(Unwrapped),因为它可以安全地确认每次访问的时候都有一个值