您首先需要了解声明变量/常量和初始化变量/常量之间的区别。
声明变量告诉 Swift 你正在添加一个新变量。
变量 (var) 或常量 (let) 声明如下所示:
let firstTestInstance: TestClass
在这里,我们声明了一个名为firstTestInstance 的常量,其类型为TestClass。
初始化变量会为该变量分配一个初始值。
已声明的变量或常量的初始化如下所示:
firstTestInstance = TestClass()
在这里,我们正在创建TestClass 的新实例并将其分配为firstTestInstance 的初始值。
也可以将这两个步骤组合在一行中:
let firstTestInstance: TestClass = TestClass()
因为从这行可以看出常量的类型是TestClass,所以我们可以排除类型注解:
let firstTestInstance = TestClass()
在这里,Swift 能够推断出firstTestInstance 的类型。这称为类型推断。
你问的第二种方式
我会讲你的第一个例子,但你的第二个例子更容易解释。
您发布了以下内容:
let secondTestInstance = TestClass()
在这里,您将声明与初始化相结合。推断secondTestInstance的类型为TestClass。
你问的第一种方式
您发布了以下内容:
let firstTestInstance: TestClass!
firstTestInstance = TestClass()
有人可能会说这与您的第二个示例完全相同,但只是分两个单独的步骤。通常,这是正确的,但这次不正确,因为! 在TestClass 之后。这两行相当于下面的一行:
let firstTestInstance: TestClass! = TestClass()
这里,如果 Swift 试图自己推断 firstTestInstance 的类型,它会推断出 TestClass 的类型。但是在这里,您提供了一个类型注释,告诉 Swift 该类型实际上应该是TestClass!,这与简单的TestClass 不同。
基本上,通过将! 附加到类型注释的末尾,您是说该类型实际上是隐式展开的可选TestClass。
可选参数(包括隐式展开的)在The Basics section of The Swift Programming Language 指南的“可选参数”中进行了描述。
哪个更好?
忽略您的第一个示例使用隐式展开的可选选项这一事实,而只关注使用 1 行还是 2 行更好,答案是视情况而定。如果您可以在 1 行上完成,请继续。这样更干净。但是,在某些情况下,您可能需要在两个单独的行中执行此操作,例如以下示例:
let myConstant: String
if boolVariable {
myConstant = "hello"
} else {
myConstant = "world"
}