Swift 为什么要使用初始值设定项?

Swift 为什么要使用初始值设定项?,swift,Swift,新手,来自PHP。温柔点 这是一个带有初始值设定项的swift结构 struct Book { let title: String let author: String let price: String let pubDate: String init(title: String, author: String, price: String, pubDate: String){ self.title = title se

新手,来自PHP。温柔点

这是一个带有初始值设定项的swift结构

struct Book {
    let title: String
    let author: String
    let price: String
    let pubDate: String

    init(title: String, author: String, price: String, pubDate: String){
        self.title = title
        self.author = author
        self.price = price
        self.pubDate = pubDate
    }

}

let HarryPotter = Book(title: "Harry Potter", author: "JK Rowling",
                       price: "30$", pubDate: "January 10th, 1998")
这是一个没有初始化器的快速结构

struct Book {
    let title: String
    let author: String
    let price: String
    let pubDate: String 
}

let HarryPotter = Book(title: "Harry Potter", author: "JK Rowling",
                       price: "30$", pubDate: "January 10th, 1998")

如果这两个都做相同的事情,那么使用初始值设定器的优势是什么?

在您的特定情况下,没有什么,因为您的初始值设定器所做的只是设置值。但是,也有可能在初始化器中有其他代码实际执行某些操作。

在您的特定情况下,没有任何操作,因为初始化器所做的只是设置值。但是有可能在初始化器中有其他代码实际执行某些操作。

如果你想事先在构造函数/初始化器中包含一些逻辑,你可以这样做。

如果你想事先在构造函数/初始化器中包含一些逻辑,你可以这样做。

这是一个猜测,因为我是Ruby开发者而不是Swift,但有时您可能希望在初始值设定项中运行更多(任意)代码,而不仅仅是将参数值分配给实例变量。例如:

def initialize(attr)
  @attr = attr
  puts "I'm initializing!"
end

在上面的例子中,我已经指定了属性并打印到stdout。我猜在Swift中,所有的属性分配都是自动完成的,因此如果您只想分配属性,您可以避免自己编写初始值设定项,让Swift来处理它。

这是一个猜测,因为我是Ruby开发人员,而不是Swift,但有时您可能希望运行更多(任意的)除了将参数值赋给实例变量之外,还需要在初始值设定项中编写代码。例如:

def initialize(attr)
  @attr = attr
  puts "I'm initializing!"
end

在上面的例子中,我已经指定了属性并打印到stdout。我猜在Swift中,所有的属性分配都是自动完成的,因此如果您只想分配属性,您可以避免自己编写初始值设定项,让Swift处理它。

在第二种情况下,您仍然使用初始值设定项。您正在使用,它是为您生成的,因为您没有指定任何自己的

Swift为任何结构或类提供默认初始值设定项,该结构或类为其所有属性提供默认值,但本身不提供至少一个初始值设定项。默认初始值设定项只是创建一个新实例,其所有属性都设置为默认值


回答更一般的问题,初始化的目的是什么:它们封装了实例的初始化,并保证您永远无法获得处于“半生不熟”状态的实例。它们是Swift的等价物。

在第二种情况下,您仍然使用初始值设定项。您正在使用,它是为您生成的,因为您没有指定任何自己的

Swift为任何结构或类提供默认初始值设定项,该结构或类为其所有属性提供默认值,但本身不提供至少一个初始值设定项。默认初始值设定项只是创建一个新实例,其所有属性都设置为默认值

回答更一般的问题,初始化的目的是什么:它们封装了实例的初始化,并保证您永远无法获得处于“半生不熟”状态的实例。他们是斯威夫特的同类