【问题标题】:Ways to Create Instance创建实例的方法
【发布时间】:2017-02-09 06:22:08
【问题描述】:

我有一个这样的课程:

class TestClass {
    let str = "string"
}

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

第一种方式:

let firstTestInstance: TestClass!
firstTestInstance = TestClass()

第二种方式:

let secondTestInstance = TestClass()

我想知道:

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

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

【问题讨论】:

  • 第二种方式只是将第一种方式的前两行组合起来。

标签: swift


【解决方案1】:

您首先需要了解声明变量/常量和初始化变量/常量之间的区别。

声明变量告诉 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"
}

【讨论】:

  • 非常感谢
【解决方案2】:

第一种方式首先将常量声明为 TextClass 类型,然后在第二行将其设置为 TestClass。

正如戴维所说,第二行只是将两者结合起来,将常量声明并设置为 TestClass。

哪个更好?我不确定这两种方法有什么真正的区别,所以我更喜欢使用第二种方法,因为它有助于使代码看起来更简洁,只使用一行而不是两行。

【讨论】:

  • 如果不是第一个!的话会这样。
猜你喜欢
  • 2011-08-24
  • 2018-11-23
  • 2011-02-27
  • 2022-11-16
  • 2012-10-26
  • 2021-09-22
  • 1970-01-01
相关资源
最近更新 更多