Swift-当需要满足所需的初始化程序时,如何在子类中初始化属性?

时间:2018-07-20 12:09:52

标签: swift protocols swift4 subclass initializer

按标题。

由于必需的 init(a:),除非我如上所述进行重载,否则无法初始化'b'。

问题(1):

是否有更好的方法来解决此问题?看来必须要包括 self.b = 0

class BaseClass {
var a: Int

required init(a: Int) {
    self.a = a
    }
}

class SubClass: BaseClass {
var b: Int

init(b: Int, a: Int){
    self.b = b
    super.init(a: a)
     }

required init(a: Int) {
    self.b = 0         // have to put something here, otherwise complain
    super.init(a: a)
     }
}

然后打电话给,例如:

let mySubClass = SubClass(b:2, a:3) //works by calling init(b:a:)

注意:另一个解决方法是照这样执行必需的init 中的致命错误(但同样,它看起来不太正确):

required init(a: Int) {
 // fatal error()
 }

此外,这使我想到下一个问题,涉及下一个示例。

问题(2):

在存在协议的情况下,例如:

protocol RandomProtocol {
    init(randomProp: Int)
}

致电例如:

let mySubClassWithProtocol = SubClassWithProtocol(c: 1, a: 2, b: 3)      //works ok

是否有更好的方法来实现?再次,像上面一样,似乎有点令人费解并且违反直觉

下面的

SubClassWithProtocol 需要从 RandomProtocol SubClass 实现所需的初始化

class SubClassWithProtocol: SubClass, RandomProtocol {

var c: Int

init(c: Int, a: Int, b: Int, randomProp: Int) {
    self.c = c
    super.init(b: b, a: a)
}

required init(a: Int) {
    self.c = 0
    super.init(a: a)
}

required init(randomProp: Int) {
//need to call self.c and super.init, otherwise complain    
    self.c = 0
    super.init(b: 0, a: 0)
}   

注释:

从Swift开始就在这里。试图弄清楚我的出路。我了解上述问题可能是学术性而非实用性。但是,谢谢您的帮助。

1 个答案:

答案 0 :(得分:0)

除了必须在初始化程序中设置默认值之外,还有其他其他方法可以初始化属性吗?是的,有-

  • 您可以将b设为可选-var b: Int?

  • 您可以将b设为隐式解包的可选-var b: Int!

  • 您可以在声明时为b设置默认值-var b: Int = 0

这些方法将使您不必在初始化程序中调用self.b = 0,但正如Joakim在现实世界中指出的那样,您使用哪种方法取决于您的情况。