Swift对类型安全性给予很高的重视。整个Swift语言在设计时都考虑了安全性。它是Swift的标志之一,您应该张开双臂欢迎它。它将有助于开发清晰易读的代码,并有助于防止应用程序崩溃。
Swift中的所有可选选项均以?
符号分隔。通过?
在您声明为可选的类型的名称之后设置after,您实际上将其强制转换为不是在之前的类型?
,而是强制为可选类型。
注意:变量或类型Int
是不一样的Int?
。它们是两种不能相互操作的不同类型。
使用可选
var myString: String?
myString = "foobar"
但这并不意味着你是一个类型的工作String
。这意味着您正在使用String?
(字符串可选,或可选字符串)类型。实际上,每当您尝试
print(myString)
在运行时,调试控制台将打印Optional("foobar")
。“ Optional()
”部分表示此变量在运行时可能有值,也可能没有值,但是正好当前包含字符串“ foobar”。这个 ”Optional()
除非您执行所谓的“解包”可选值,否则指示将保持不变。
展开可选内容意味着您现在正在将该类型转换为非可选内容。这将生成一个新类型,并将驻留在该可选值内的值分配给新的非可选类型。这样,您可以对该变量执行操作,因为编译器已保证该变量具有固定值。
有条件地展开将检查可选中的值是否为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代码。它打印出myString
设置为“ foobar”的值。用户将foobar
在控制台中看到打印内容,仅此而已。但让我们假设该值从未设置过:
var myString: String?
print(myString!)
现在,我们面临着另一种情况。与Objective-C不同,每当尝试强行打开可选对象,而未设置nil
可选对象为时,当您尝试打开可选对象以查看应用程序内部崩溃时,该对象将崩溃。
带类型转换的展开。如前所述,虽然您是unwrapping
可选的,但实际上是将其转换为非可选类型,也可以将非可选类型转换为其他类型。例如:
var something: Any?
在我们代码的某个位置,变量something
将被设置一些值。也许我们正在使用泛型,或者可能正在发生其他逻辑,这将导致这种情况发生改变。因此,在我们的代码后面,我们想使用,something
但是如果它是不同的类型,仍然可以区别对待。在这种情况下,您将需要使用as
关键字来确定这一点:
注意:as
运算符是您在Swift中键入强制类型转换的方式。
// 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
,否则就像在值是时使用bang运算符一样nil
您的应用程序会崩溃。
为了在某种排序或数学运算中完全使用这些变量,必须对其进行包装。
例如,在Swift中,只能对相同类型的有效数字数据类型进行互操作。当您使用as!
强制转换类型时,您将强制对该变量进行向下转换,就好像您确定它属于该类型一样,因此可以安全地进行操作并且不会使应用程序崩溃。只要变量确实是您要对其强制转换的类型,就可以,否则,您将一团糟。
尽管如此,使用强制类型转换as!
将允许您的代码进行编译。用铸造as?
是一个不同的故事。实际上,as?
将您Int
一起声明为完全不同的数据类型。
现在它是 Optional(0)
而且,如果您尝试写作业,例如
1 + Optional(1) = 2
您的数学老师可能会给您一个“ F”。与Swift相同。除了Swift,她宁愿根本不编译,也不愿给你一个分数。因为在一天结束时,可选项实际上可能为零。
安全第一的孩子。