Swift Overload init()

问题描述 投票:9回答:1

我将在Swift中重载init方法如何实现它?

这里我的代码不起作用

代码删除

编辑:

所以它会很好

override init() {
    super.init();
}

init(title:String?) {
    super.init();
    self.title = title
}

convenience init(title:String?, imageName:String?) {
    self.init(title:title)
    self.imageName = imageName
}

convenience init(title:String?, imageName:String?, contentKey:String?) {
    self.init(title:title, imageName:imageName)
    self.contentKey = contentKey
}
xcode swift overloading init
1个回答
17
投票

更新的答案

class Y { }
class X : Y {
    var title: String?
    var imageName: String?

    convenience override init() {
        self.init(title: nil, imageName: nil)
    }

    convenience init(title:String?) {
        self.init(title: title, imageName: nil)
    }

    init(title: String?, imageName: String?) {
        self.title = title
        self.imageName = imageName
        super.init()
    }
}
  • 使用最完整的初始化程序作为指定的初始化程序。 在这种情况下,init(title: String?, imageName: String?)是唯一设置其所有属性的初始化程序,因此它应该是指定的初始化程序。
  • 在调用super.init()之前初始化您的属性。 我的旧答案才有效,因为titleimageName都是var和可选。 在The Swift Programming Language: Initialization的两阶段初始化部分 安全检查1 指定的初始值设定项必须确保在委托一个超类初始化程序之前初始化其类引入的所有属性。

老答案

我将样品插入操场,以下是我如何使用它:

class Y { }
class X : Y {
    var title: String?
    var imageName: String?

    override init() {

    }

    init(aTitle:String?) {
        super.init()
        self.title = aTitle
    }

    convenience init(aTitle:String?, aImageName:String?) {
        self.init(aTitle: aTitle)
        self.imageName = aImageName
    }
}
  • init(aTitle:String?, aImageName:String?)不能调用init(aTitle:)并且仍然是指定的初始化程序,它必须是一个方便的初始化程序。
  • self.init必须在init(aTitle:String?, aImageName:String?)之前。
  • 初始化器必须传递参数名称self.init(aTitle)必须是self.init(aTitle: aTitle)

作为旁注,我删除了不需要的分号,并将super.init()放在第一位,因为样式原因。

希望有所帮助。


UPDATE

要遵循Apple的建议,应该只指定一个,其余应该是便利初始化器。例如,如果您确定init(aTitle:String?)应该是指定的初始化程序,那么代码应如下所示:

convenience override init() {
    self.init(aTitle: nil) // A convenience initializer calls the designated initializer.
}

init(aTitle:String?) {
    super.init() // Only the designated initializer calls super.init.
    self.title = aTitle
}

convenience init(aTitle:String?, aImageName:String?) {
    self.init(aTitle: aTitle)  // A convenience initializer calls the designated initializer.
    self.imageName = aImageName
}

有时您可能需要多次指定的初始化程序,例如UIView,但这应该是一个例外,而不是规则。


更新2

类应该有一个指定的初始化程序。便利初始化程序将(最终)调用指定的初始化程序。

Initialization

一个类可能有多个初始值设定项。当初始化数据可以采用不同形式或某些初始化器时,为方便起见,提供默认值时会发生这种情况。在这种情况下,其中一个初始化方法称为指定初始化程序,它接受完整的初始化参数。

Multiple initializers

The Designated Initializer

获取完整初始化参数的类的初始化器通常是指定的初始化器。子类的指定初始化程序必须通过向super发送消息来调用其超类的指定初始值设定项。方便(或辅助)初始化程序 - 可以包括init-不要调用super。相反,他们使用下一个参数调用(通过消息自我)系列中的初始化程序,为未传递给它的参数提供默认值。本系列的最终初始化程序是指定的初始化程序。

© www.soinside.com 2019 - 2024. All rights reserved.