为什么需要在Swift中使用Initializers?

时间:2019-02-21 15:23:55

标签: swift

具有第一个结构:

struct example {
    var name: String
    var number: Int
    func show (data: String) {
        print(data)
    }
}

let obj = example(name: "Hello World", number: 2)

第二个结构:

struct example2 {
    var nameModified: String
    var numberModified: Int
    init(nameFrom: String, numberFrom: Int) {
        nameModified = nameFrom + "World"
        numberModified = numberFrom + 1
    }
}

let obj2 = example2(nameFrom: "Hello", numberFrom: 1)

我看不到拥有初始化方法和没有初始化方法之间的区别。 我可能没有看到正确的功能。有谁能指出我正确的方向?

谢谢!

2 个答案:

答案 0 :(得分:4)

在结构中,根据结构的属性推断默认的初始化函数。
因此,您可以编写此init函数,也可以将其忽略:

init(nameFrom: String, numberFrom: Int) { ... }

显式添加init函数的好处是,如果您要这样做,则可以在init函数中执行代码。
另外,您当然可以添加自定义convenience init函数。

但是请注意,这不是类的功能。对于这些,您将始终必须显式编写一个初始化程序。

您可以放心地做:

struct Example {
    var name: String
    var number: Int
}

...但是:

class Example {
    var name: String
    var number: Int
}

...将引发以下错误:

  

“示例”类没有初始化程序

相反,您必须这样做:

class Example {
    var name: String
    var number: Int

    init(name: String, number: Int) {
        self.name = name
        self.number = number
    }
}

但是,如果要为类内的属性提供默认值,则不必编写显式的初始化程序:

class Example {
    var name: String?
    var number: Int = 0
}

答案 1 :(得分:2)

使用Swift,符合以下条件的类和结构都包含默认的初始化程序。

  

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

https://docs.swift.org/swift-book/LanguageGuide/Initialization.html