我有一个这样的课程:
class TestClass {
let str = "string"
}
现在,我知道创建实例的两种方法。
第一种方式:
let firstTestInstance: TestClass!
firstTestInstance = TestClass()
第二种方式:
let secondTestInstance = TestClass()
我想知道:
PS:我看到Swift文档使用第二种方式。
答案 0 :(得分:4)
首先需要了解声明变量/常量与初始化变量/常量之间的区别。
声明变量告诉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"
}
答案 1 :(得分:0)
第一种方法首先将常量声明为TextClass类型,然后在第二行将其设置为TestClass。
正如戴维所说,第二行只是将两者结合起来,将常量声明并设置为TestClass。
哪个更好?我不确定两种方式之间是否存在任何真正的区别所以我更喜欢使用第二种方法,因为它只使用一行而不是两行来帮助使代码看起来更清晰。