从零开始的8-bit迷宫探险【Level 7】Swift 基础语法 (五)

今日目标

  • 认识 nil
  • 认识 Optional
  • 认识 if let 及 guard let

nil

nil 代表的是空值
swift 的语言设计为了安全性,是不能宣告或给定一个值为 nil 的。

var role: String = nil // 系统提示错误
var role2: String = "human"
role2 = nil // 系统提示错误

但有的时候的确会有无法给定值的情况,这时候可以使用 Optional,在形态的後方加上一个问号 ?

var role: String? = nil // 编译正常
var role2: String? = "human"
role2 = nil // 编译正常

Optional

Optional 是一种型别,他可以是值 (wrapped value) 或是 nil,使用 ? 表示。
当一个变数被宣告成 Optional 使用的时候,在编译的过程中,就会被检查出来,提醒开发者对它做适当的处理,避免程序运行的时候发生 crash。

var role: String? = "human"
let msg = "This is " + role // 系统提示错误
  • 提示必须解析它 (unwrap)
    https://imgur.com/KAcwWkY.png

使用强制解析

强制解析 (forced unwrap) 是一种快速的方式,使用 ! 表示。
使用强制解析虽然快速,但是相对比较不安全,开发者必须确定一定会有值,否则还是有可能会在程序运行时发生 crash。

  • role 确定有值
var role: String? = "human"
let msg = "This is " + role! // 编译正常
print(msg)
印出结果:
This is human
  • role 的值是 nil,发生 Fatal error
    https://imgur.com/62RvdSQ.png

if let

另一种比较安全的方式,可以使用 if let 的方式,如果 role 有值,则将它的值解析後设定给 newRole,并且执行後方的程序码,否则会执行 else 里的程序码。在这边的 newRole 就不是 Optional 型别了,因此不须使用 !

  • 当 role 有值:
var role: String? = "human"
if let newRole = role {
    let msg = "This is " + newRole
    print(msg)
} else {
    print("nil")
}
印出结果:
This is human
  • 当 role 为 nil:
var role: String? = nil
if let newRole = role {
    let msg = "This is " + newRole
    print(msg)
} else {
    print("nil")
}
印出结果:
nil

guard let

当上述的 if let 使用得比较多的时候,可能会造成程序码易读性下降,而使用 guard let 可以让程序码更简洁明了。guard let 的用法与 if let 类似,但是多加了 else,会执行解析不到值的情况,因此我们可以先过滤掉非预期的状况,在解析不到值的时候,就先将程序中断 (return),而如果都解析出值,则可以专注处理该执行的程序码。
如以下范例:在这边宣告的 numberAnumberB 常数,若皆有值的时候,是可以在後续的程序码中使用的,如後续对两个常数做加法。

  • 当 a 跟 b 有值:
func doMath(a: Int?, b: Int?) {
    guard let numberA = a, let numberB = b else {
        print("error")
        return
    }
    print(numberA + numberB)
}
doMath(a: 5, b: 4)
印出结果:
9
  • 当 a 为 nil:
func doMath(a: Int?, b: Int?) {
    guard let numberA = a, let numberB = b else {
        print("error")
        return
    }
    print(numberA + numberB)
}
doMath(a: nil, b: 4)
印出结果:
error

swift 的基础语法介绍到今天就告一个段落了,明天开始会带大家认识 SpriteKit
/images/emoticon/emoticon07.gif


参考来源:
Optional


<<:  [Day-6] C++关於运算的小学习

>>:  30 天 React 学习之路 (Day1)

Day 16 撰写一个 dockerfile,和 vue-cli 服务进行整合开发

使用 Vue 作为前端框架的开发者,对於 vue-cli 想必不陌生。将 Docker 和 vue-...

Day26 Project3 - LINE Bot 注册

Day25已经利用第三方API获得了每日汇率,但这样还是解决不了要自己手动打开DB查资料的问题,为了...

Day 1 行前说明

领队报告领队报告,Python爬虫之旅就要启程啦~ 请团员们准备好行李,我们准备出发! 今天的影片为...

YouTube 转换为 MP3

由於 YouTube 没有提供下载服务,人们如何将影片、音乐资源转换成 MP3 以便离线播放呢?接下...

[Day14] Tableau 轻松学 - 美化工作表外观

前言 相对於数据视觉化操作,官方在外观调整的教学算是较少,或许难下关键字也是一个问题。平常在实作的时...