0Pricing
Swift Academy · 课时

可选值

可选值

可选值 是 CoddyKit 上的免费 Swift Academy 课时。 这是第 1 节课,共 1 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Swift Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Swift Academy 课程共包含 1 节课。

简介

您好,

可选变量用于表示变量可能没有值。

如果可选类型的变量有值,就会将该变量解包并使用;否则,它没有值。

Swift 中许多类型都可以使用可选项

它可以类比于 Obj-C 中的空指针。不过,空指针仅对对象类型有效。

Swift 中的可选项不仅可用于对象类型,也可用于结构体、枚举或简单类型。

var optionalVar: String?
// optionalVar is automatically set to nil]
/*
Since we define it as optional without
assigning a value, the variable 
automatically takes the value of nil.
*/

Swift 中的空值与 Obj-C 中的空值并不相同

Swift 中的空值与 Obj-C 中的空值并不相同。

Obj-C 中的空指针表示对象不存在。Swift 中并不存在这种空指针。Swift 中的空值表示数据不存在,并且它不仅支持对象类型,也支持其他类型。

强制解包

可以使用强制解包方法访问定义为可选项的变量。

使用感叹号运算符可以强制解包代码,但通常不建议这样做。

如果强制解包时引用的数据不存在,就会产生运行时错误。

let convertedNumber : Int? = 123
if convertedNumber != nil {
    print("convertedNumber has an integer value of \(convertedNumber!).")
}
// Prints "convertedNumber has an integer value of 123."

使用可选绑定访问可选项

使用可选绑定访问可选项

通过 if let代码块,可以将可选变量的值赋给常量或变量,从而访问该值。

与强制解包相比,使用这种方式更加优雅。

var possibleNumber : String? = "10"

if let actualNumber = possibleNumber {
    print(actualNumber)
}

示例

if let firstNumber = Int("4"), let secondNumber = Int("42"), 
  firstNumber < secondNumber && secondNumber < 100 {
    print("\(firstNumber) < \(secondNumber) < 100")
}
// Prints "4 < 42 < 100"
/*
 If at least one of them is false,
 it will not be entered in the if blog.
*/

隐式解包的可选项

隐式解包的可选项

在某些情况下,可选值会在第一阶段被赋值,并且在后续使用时确定不会为空。

在这种情况下,可以不用可选运算符(?),而改用(!)运算符来表示该可选项一定不为空。 

这种定义形式称为“隐式解包的可选项”。

隐式解包

隐式解包

最常见的使用场景是类的初始化阶段。

与传统的可选项不同,对于以隐式解包方式声明的变量,我们不需要再对其解包。

let possibleString: String? = "An optional string."
 // requires an exclamation mark
let forcedString: String = possibleString!

let assumedString: String! = "An implicitly unwrapped optional string."
// no need for an exclamation mark
let implicitString: String = assumedString 

示例

如果将空值赋给此类型的变量,就会产生运行时错误。

让我们来看一个示例

/*
We can use it during optional binding or we can check for nil.
So we use implicitly unwrapped optional 
in the same way we use classic optional.
*/

var assumedString: String! = nil

if let definiteString = assumedString {
    print(definiteString)
}
// Prints "An implicitly unwrapped optional string."

警告

如果变量有可能为空,就不要使用隐式解包的可选项。

空值合并运算符

空值合并运算符

它可以方便地解包可选类型。

让我们通过示例来了解它。

let defaultColorName = "red"
 // defaults to nil
var userDefinedColorName: String?  

var colorNameToUse = userDefinedColorName ?? defaultColorName
/*
userDefinedColorName is nil, 
so colorNameToUse is set to the default of "red"
*/


// a != nil ? a! : b 
/*
We can think of it as a shortcut to the above expression.
A checks if a is nil, if a is not nil, it unwrap and eturn, 
otherwise it returns the default value, ie b.
*/

恭喜您

恭喜您 🎉

可选值是 Swift 最重要的特性之一。使用可选值可以避免进行空值检查,让代码更加优雅,并使应用程序更加安全。

下一课再见 🥳

可选值 — 插图 12

常见问题解答

「可选值」课时是免费的吗?

是的 — 「可选值」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Swift Academy 课程的其余内容,请升级到 CoddyKit PRO。 Swift Academy 课程共包含 1 节课。

「可选值」这节课中我会学到什么?

可选值 你通过在浏览器中直接运行的动手代码来练习 Swift Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Swift Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Swift Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 1 节。

「可选值」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Swift Academy 课中编写并运行代码吗?

能。每节 Swift Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

← 返回 Swift Academy