当我回过头来查看Apple的一些Sprite Kit文档时,我发现很多情况下会出现一个名为convenience
的关键字。例如
convenience init(texture texture: SKTexture?, size size: CGSize)
这是什么意思?
答案 0 :(得分:1)
来自文档:
便利初始化程序是次要的,支持类的初始值设定项。您可以定义一个便捷初始值设定项,以便从与便捷初始化程序相同的类中调用指定的初始值设定项,并将某些指定的初始值设定项参数设置为默认值。您还可以定义一个便捷初始值设定项,以便为特定用例或输入值类型创建该类的实例。
未标记为convenience
的初始值设定项是指定的初始值设定项:
指定的初始化程序是类的主要初始值设定项。指定的初始化程序完全初始化该类引入的所有属性,并调用适当的超类初始化程序以继续超类链的初始化过程。
我上面链接的文档非常详细,因为初始化有很多。您需要阅读它们才能真正了解正在发生的事情。但举一个例子,让我们说你创建了一个car
类:
class Car {
let numberOfWheels: Int
init(numberOfWheels: Int) {
self.numberOfWheels = numberOfWheels
}
convenience init() {
self.init(numberOfWheels: 4)
}
}
汽车类包含两个初始值设定项 - 指定的初始值设定项和便捷初始值设定项。
指定的初始值设定项只标记为init
。在指定的初始化程序中,您需要设置所有类属性,以便在初始化完成后该类已准备就绪。我们在初始值设定项中设置了numberOfWheels
。
便捷初始值设定项标记为convenience init
。一个便利初始化器可以做任何事情,但它必须在它完成之前调用一个指定的初始化器。在我们的示例中,它调用self.init(numberOfWheels: Int)
并提供默认数量的轮子(4)。
便利初始化器完全适用于他们的同名:便利。它们允许您为处理常见初始化情况的类设置初始值设定项。在我们的Car
课程中,汽车通常有四个轮子,因此我们的便利初始化程序使这种常见情况更容易。
要创建汽车,我们可以使用指定的初始化程序或便利初始化程序:
let carA = Car(numberOfWheels: 3) // makes a car with 3 wheels
let carB = Car() // makes a car with 4 wheels
有很多关于初始化的规则,特别是在必须考虑super.init
和初始化器继承的类层次结构中。我无法比official documentation更好或更简洁地描述它们,所以我建议你再检查一下。
答案 1 :(得分:1)
便利性初始化程序允许您在没有指定初始化程序所需的所有必需参数的情况下初始化类。
例如,在一个非常基本的示例中,您可能为需要字符串的类指定了初始化程序:
init someName(value: String) {
您还可以创建一个便利初始化器,以便接受一个int并将其转换为String,然后调用指定的初始化器并将其传递给String。这样一来,如果你的类被初始化并传递了一个int而不是错误,那么它就会出错并且会处理它。
convenience init someName2(value: Int) {
let someString = String(value)
someName(value: someString)
}
它们的另一个用途是指定的初始化器可以采用多个参数。你可以创建一个方便的初始化器,它只接受其中一个参数,创建其他参数并将它们设置为某些默认值,然后调用指定的初始化器,将它们全部传入。这样你就不需要指定所有指定初始化程序的必需参数,因为如果您没有,您的便利初始化程序将使用默认值填写缺失的初始化程序。
convenience init someName(value: String) {
someName(value: someString, value2: "DefaultValue")
}
init someName(value: String, value2: String) {
答案 2 :(得分:0)
默认初始化: 指定的初始化器是类的主要初始化器。指定的初始化程序会完全初始化该类引入的所有属性,并调用适当的超类初始化程序以继续超类链中的初始化过程。
便捷初始化: 便捷初始化器是辅助的,支持类的初始化器。您可以定义一个便捷初始化程序,以从与便捷初始化程序相同的类中调用一个指定初始化程序,并将某些指定初始值设定项的参数设置为默认值。您还可以定义一个便捷初始化程序,以针对特定用例或输入值类型创建该类的实例。
根据《快速文档》
实际上-Swift定义了两种初始化器。
指定的初始化程序是类的主要初始化程序。每个类都应至少有一个指定的初始化程序。
init(parameters if any) {
}
便利初始化器是次要的,支持类的初始化器。便捷初始化程序以相同的样式编写,但将便捷修饰符放在init关键字之前,并用空格分隔:
convenience init(parameters if any) {
}
便捷init通过调用self.init初始化指定的init方法。
示例:
class HumanBeing {
var name: String
init(name: String) {
self.name = name
}
convenience init() {
self.init(name: “not set”)
// Convenience init call the designated init method
}
}
let humanBeingObj1 = HumanBeing() // calls convenience init
let humanBeingObj2 = HumanBeing(name: “abhilash”) // calls designated init