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 是一种型别,他可以是值 (wrapped value) 或是 nil,使用 ?
表示。
当一个变数被宣告成 Optional 使用的时候,在编译的过程中,就会被检查出来,提醒开发者对它做适当的处理,避免程序运行的时候发生 crash。
var role: String? = "human"
let msg = "This is " + role // 系统提示错误
强制解析 (forced unwrap) 是一种快速的方式,使用 !
表示。
使用强制解析虽然快速,但是相对比较不安全,开发者必须确定一定会有值,否则还是有可能会在程序运行时发生 crash。
var role: String? = "human"
let msg = "This is " + role! // 编译正常
print(msg)
印出结果:
This is human
另一种比较安全的方式,可以使用 if let
的方式,如果 role 有值,则将它的值解析後设定给 newRole,并且执行後方的程序码,否则会执行 else 里的程序码。在这边的 newRole 就不是 Optional 型别了,因此不须使用 !
var role: String? = "human"
if let newRole = role {
let msg = "This is " + newRole
print(msg)
} else {
print("nil")
}
印出结果:
This is human
var role: String? = nil
if let newRole = role {
let msg = "This is " + newRole
print(msg)
} else {
print("nil")
}
印出结果:
nil
当上述的 if let
使用得比较多的时候,可能会造成程序码易读性下降,而使用 guard let
可以让程序码更简洁明了。guard let
的用法与 if let
类似,但是多加了 else
,会执行解析不到值的情况,因此我们可以先过滤掉非预期的状况,在解析不到值的时候,就先将程序中断 (return),而如果都解析出值,则可以专注处理该执行的程序码。
如以下范例:在这边宣告的 numberA
及 numberB
常数,若皆有值的时候,是可以在後续的程序码中使用的,如後续对两个常数做加法。
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
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
参考来源:
Optional
使用 Vue 作为前端框架的开发者,对於 vue-cli 想必不陌生。将 Docker 和 vue-...
Day25已经利用第三方API获得了每日汇率,但这样还是解决不了要自己手动打开DB查资料的问题,为了...
领队报告领队报告,Python爬虫之旅就要启程啦~ 请团员们准备好行李,我们准备出发! 今天的影片为...
由於 YouTube 没有提供下载服务,人们如何将影片、音乐资源转换成 MP3 以便离线播放呢?接下...
前言 相对於数据视觉化操作,官方在外观调整的教学算是较少,或许难下关键字也是一个问题。平常在实作的时...