按标题。
由于必需的 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开始就在这里。试图弄清楚我的出路。我了解上述问题可能是学术性而非实用性。但是,谢谢您的帮助。
答案 0 :(得分:0)
除了必须在初始化程序中设置默认值之外,还有其他其他方法可以初始化属性吗?是的,有-
您可以将b
设为可选-var b: Int?
您可以将b
设为隐式解包的可选-var b: Int!
您可以在声明时为b
设置默认值-var b: Int = 0
这些方法将使您不必在初始化程序中调用self.b = 0
,但正如Joakim在现实世界中指出的那样,您使用哪种方法取决于您的情况。