创建实例的方法

时间:2017-02-09 06:22:09

标签: swift

我有一个这样的课程:

class TestClass {
    let str = "string"
}

现在,我知道创建实例的两种方法。

第一种方式:

let firstTestInstance: TestClass!
firstTestInstance = TestClass()

第二种方式:

let secondTestInstance = TestClass()

我想知道:

  • 第一种方式和第二种方式有什么区别?
  • 哪个更好?为什么?
  • 还有其他方法可以创建实例吗?

PS:我看到Swift文档使用第二种方式。

2 个答案:

答案 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。

哪个更好?我不确定两种方式之间是否存在任何真正的区别所以我更喜欢使用第二种方法,因为它只使用一行而不是两行来帮助使代码看起来更清晰。

相关问题