Swift 非常重视类型安全。整个 Swift 语言的设计都考虑到了安全性。这是 Swift 的标志之一,你应该张开双臂欢迎它。它将有助于开发干净、可读的代码,并帮助防止您的应用程序崩溃。
Swift 中的所有选项都用? 符号划分。通过在您声明为可选的类型名称之后设置?,您实际上强制转换这不是?之前的类型,而是作为可选类型。
注意:变量或类型Int不与Int? 相同。它们是两种不同的类型,不能相互操作。
使用可选
var myString: String?
myString = "foobar"
这不意味着您正在使用String 类型。这意味着您正在使用String? 类型(可选字符串或可选字符串)。事实上,每当你尝试
print(myString)
在运行时,调试控制台将打印Optional("foobar")。 “Optional()”部分表示该变量在运行时可能有值,也可能没有值,但恰好当前包含字符串“foobar”。此“Optional()”指示将保留,除非您执行所谓的“解包”可选值。
展开一个可选的意味着你现在将该类型转换为非可选的。这将生成一个新类型并将驻留在该可选类型中的值分配给新的非可选类型。通过这种方式,您可以对该变量执行操作,因为编译器已保证该变量具有可靠的值。
Conditionally Unwrapping 将检查可选项中的值是否为nil。如果不是nil,则会有一个新创建的常量变量,该变量将被赋值并展开到非可选常量中。从那里您可以安全地使用 if 块中的非可选项。
注意:你可以给你的条件解包常量与你解包的可选变量同名。
if let myString = myString {
print(myString)
// will print "foobar"
}
有条件地展开可选项是访问可选项值的最简洁的方法,因为如果它包含一个 nil 值,那么 if let 块中的所有内容都不会执行。当然,就像任何 if 语句一样,您可以包含一个 else 块
if let myString = myString {
print(myString)
// will print "foobar"
}
else {
print("No value")
}
强制展开是通过使用所谓的!(“bang”)运算符来完成的。这不太安全,但仍然允许您的代码编译。但是,无论何时使用 bang 运算符,在强制展开之前,您必须 1000% 确定您的变量确实包含一个实心值。
var myString: String?
myString = "foobar"
print(myString!)
以上是完全有效的 Swift 代码。它打印出设置为“foobar”的myString 的值。用户会看到foobar 打印在控制台中,仅此而已。但是让我们假设该值从未设置:
var myString: String?
print(myString!)
现在我们面临不同的情况。与 Objective-C 不同,每当尝试强制解包一个可选项,并且该可选项尚未设置且为 nil,当您尝试解包可选项以查看应用程序内部的内容时,将会崩溃。
使用类型转换解包。正如我们之前所说,虽然您是 unwrapping 可选的,但实际上您正在强制转换为非可选类型,您也可以将非可选类型强制转换为不同的类型。例如:
var something: Any?
在我们的代码中,变量something 将被设置为某个值。也许我们正在使用泛型,或者可能有一些其他的逻辑正在发生,这会导致这种情况发生变化。所以稍后在我们的代码中,我们想使用something,但如果它是不同的类型,仍然能够以不同的方式对待它。在这种情况下,您将需要使用 as 关键字来确定:
注意:as 运算符是您在 Swift 中键入 cast 的方式。
// Conditionally
if let thing = something as? Int {
print(thing) // 0
}
// Optionally
let thing = something as? Int
print(thing) // Optional(0)
// Forcibly
let thing = something as! Int
print(thing) // 0, if no exception is raised
注意两个as 关键字之间的区别。像以前一样,当我们强行解开一个可选项时,我们使用! bang 运算符来执行此操作。在这里,您将做同样的事情,但不是将其转换为非可选的,而是将其转换为Int。并且它必须能够被向下转换为Int,否则,就像在值为nil 时使用bang 运算符一样,您的应用程序将崩溃。
为了在某种排序或数学运算中使用这些变量,必须将它们解包。
例如,在 Swift 中,只有相同类型的有效数字数据类型可以相互操作。当您使用 as! 强制转换类型时,您会强制将该变量向下转换,就好像您 确定 它属于该类型,因此可以安全操作而不是使您的应用程序崩溃。只要变量确实是您将其转换为的类型,就可以了,否则您的手会一团糟。
尽管如此,使用as! 进行强制转换将允许您的代码编译。使用as? 铸造是另一回事。事实上,as? 将您的Int 声明为完全不同的数据类型。
现在是Optional(0)
如果你曾经尝试过写一些类似
的作业
1 + Optional(1) = 2
你的数学老师可能会给你一个“F”。与斯威夫特相同。除了 Swift 宁愿不编译也不愿给你评分。 因为在一天结束时,可选项实际上可能为零。
安全第一的孩子。