Swift能够根据我们分配给它的内容,找出常量或变量包含哪种类型的数据。然而,有时我们不想立即分配一个值,或者有时我们想覆盖Swift的类型选择,这就是类型注释的用处。
到目前为止,我们一直在制作这样的常量和变量:
let surname = "Lasso"
var score = 0
这使用类型推断:Swift推断surname
是一个字符串,因为我们为它分配了文本,然后推断score
是一个整数,因为我们为它分配了一个整数。
类型注释让我们明确我们想要哪些数据类型,如下所示:
let surname: String = "Lasso"
var score: Int = 0
现在我们明确了:surname
必须是字符串,score
必须是整数。无论如何,这正是Swift的类型推理会做的,但有时不是——有时你会想选择不同的类型。
例如,也许score
是小数点,因为用户可以得到半分,所以你会这样写:
var score: Double = 0
没有: Double
部分Swift会推断它是一个整数,但我们覆盖了它,并说它绝对是一个十进制数。
到目前为止,我们已经查看了几种类型的数据,重要的是您知道它们的名字,这样您就可以在需要时使用正确的类型注释。
String
持有文本:
let playerName: String = "Roy"
Int
持有整数:
var luckyNumber: Int = 13
Double
持有十进制数字:
let pi: Double = 3.141
Bool
判断为真或为假:
var isAuthenticated: Bool = true
Array
包含许多不同的值,全部按照您添加的顺序。这必须是专门的,例如[String]
:
var albums: [String] = ["Red", "Fearless"]
Dictionary
持有许多不同的值,您可以决定如何访问数据。这必须是专门的,例如[String: Int]
:
var user: [String: String] = ["id": "@twostraws"]
Set
包含许多不同的值,但将它们存储在优化的顺序中,以检查其中包含的内容。这必须是专门的,例如Set<String>
:
var books: Set<String> = Set(["The Bluest Eye", "Foundation", "Girl, Woman, Other"])
当您不想提供初始值时,了解所有这些类型都很重要。例如,这创建了一个字符串数组:
var soda: [String] = ["Coke", "Pepsi", "Irn-Bru"]
那里不需要类型注释,因为Swift可以看到您正在分配一个字符串数组。然而,如果您想创建一个空的字符串数组,您需要知道类型:
var teams: [String] = [String]()
同样,不需要类型注释,但您仍然需要知道字符串数组被写成[String]
,这样您才能制作这个东西。记住,在创建空数组、字典和集合时,您需要添加开括号和闭括号,因为Swift允许我们自定义它们的创建方式。
有些人更喜欢使用类型注释,然后像这样为其分配一个空数组:
var cities: [String] = []
我更喜欢尽可能多地使用类型推理,所以我会写这个:
var clues = [String]()
以及所有这些,还有枚枚枚。枚枚枚枚与其他枚枚枚枚枚枚枚枚枚枚枚枚枚枚枚枚枚枚枚枚枚枚枚枚枚枚枚枚枚枚枚枚枚枚枚枚枚枚,例如枚枚枚枚枚枚枚枚枚枚枚枚枚枚枚枚枚,包括枚枚枚枚枚枚枚字包含当前在我们的应用程序中显示的星期枚月
枚数的值与枚枚数本身的类型相同,因此我们可以像这样写:
enum UIStyle {
case light, dark, system
}
var style = UIStyle.light
这就是允许Swift删除未来任务的枚举名称的原因,因此我们可以编写style = .dark
——它知道style
的任何新值都必须是某种类型UIStyle
现在,您很有可能会问何时应该使用类型注释,因此,如果您知道我更喜欢尽可能使用类型推理,这意味着我为常量或变量分配一个值,Swift会自动选择正确的类型。有时这意味着使用像var score = 0.0
这样的东西,这样我就能得到双Double
。
最常见的例外是我还没有值的常量。你看,Swift真的很聪明:你可以创建一个还没有值的常量,稍后提供该值,Swift将确保在存在值之前我们不会意外使用它。它还将确保您只设置一次值,以便保持不变。
例如:
let username: String
// lots of complex logic
username = "@twostraws"
// lots more complex logic
print(username)
该代码是合法的:我们说的是username
在某个时候会包含一个字符串,我们在使用它之前提供了一个值。如果分配行——username = "@twostraws"
——缺失,那么Swift将拒绝构建我们的代码,因为username
没有值,同样,如果我们第二次尝试将值设置为username
,Swift也会抱怨。
这种代码需要类型注释,因为如果没有分配初始值,Swift不知道username
将包含什么样的数据。
无论您是使用类型推理还是类型注释,都有一个黄金法则:Swift必须始终知道您的常量和变量包含哪些数据类型。这是类型安全语言的核心,并阻止我们做5 + true
或类似无稽之谈。
重要提示:虽然类型注释可以让我们在一定程度上覆盖Swift的类型推理,但我们完成的代码仍然必须是可能的。例如,这是不允许的:
let score: Int = "Zero"
[本文翻译自hackingwithswift,点击链接阅读原文]
评论区