Swift Overload init()

时间:2014-10-07 10:40:53

标签: xcode swift overloading init

我将在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
}

1 个答案:

答案 0 :(得分:16)

更新了答案

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()放在第一位,因为样式原因。

希望有所帮助。


<强>更新

要遵循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

  

指定初始化程序

     

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