【Swift】Optionals and Optionals Banding


今天学习Swift 的时候,接触到了Optionals(可选项)这个概念,之后进行StringToInt强制类型转换时,被Swift的**加叹号!进行强转**的这个特性逗笑了,哈哈,非常Swift:
1
2
3
4
let possibleNumber = "123"
// 不加叹号前,转换后是optionals, 可选项。这是一个十分swift的特性。
let convertedNumber = Int(possibleNumber)!
print(convertedNumber)
后来才发现,这个!是Swift语言中的隐式展开可选项。学习一门语言,可真得需要耐心,并且要有细心和好奇心🦝,每个语言都有很多值得深入学习的知识。 补充一下可选项(Optionals)的知识:
  • 什么是可选项?
    • 可选项用来处理可能缺失的情况,比如String转Int
    • 情况一:存在一个值(不一定是数字),可以打开optinals去访问。即这个值等于x,你可以通过转化为optionals访问使用。比如在Switch语句中,case后面的值,就是一个可选项,它可能存在并且等于某个值,也可能不存在
    • 情况二:这个值不存在。比如,一个String变量中不表示为一个数字,强转后为nil,并且这个String变量无法被部分识别出整型变量,具体如下代码:
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      let 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
      3
      if 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