我正在使用XLForm
,其中包含XLFormDescriptor
类,需要使用init(title: String)
进行初始化。
我想要使用的标题是我当前类名称函数的返回值(类级别属性还不是一个功能)。
将它放在类级别,设置它的代码如下所示:
let settingsForm = XLFormDescriptor(title: self.name())
但这会产生错误:
' PanelController - > () - > PanelController&#39!;没有会员 命名'名称'
将它放在班级的初始化调用中如下所示:
let settingsForm: XLFormDescriptor
override init() {
self.settingsForm = XLFormDescriptor(title: self.dynamicType.name())
super.init()
}
这样做会出现这个错误:
'自'在super.init调用之前使用
将它放在super.init()之后会出现此错误:
Property' settingsForm'没有在super.init调用
初始化
我有什么想法可以做到这一点?
编辑:解决方法是这样做:
let settingsForm = XLFormDescriptor(title: "")
override init() {
super.init()
self.settingsForm = XLFormDescriptor(title: self.dynamicType.name())
}
答案 0 :(得分:1)
在swift中,self
在初始化所有类属性之前不可用。在编译时有一个检查。
因此,如果您有一个具有属性的类,则继承自另一个类:
class A {
var prop1: Int
init(val1: Int) {
self.prop1 = val1
}
}
class B : A {
var prop2: String
override int(val1: Int, val2: String) {
// First initialize properties of this class
self.prop2 = val2
// Next call a superclass initializer
super.init(val1: val1)
// From now on, you can use 'self'
}
}
在所有(非可选)类属性已初始化之前,您无法使用self
和已调用超类初始化程序(如果该类已继承)。
如果您内联初始化属性,请执行以下操作:
let settingsForm = XLFormDescriptor(title: self.name())
在类实例初始化之前,您明确使用self
- 这就是编译错误的原因。
您自己找到的解决方案不是解决方法,而是正确的解决方法。首先使用不引用self
的值初始化属性,然后在初始化类之后,为该属性分配一个新值。
请注意,这是唯一允许您为不可变属性分配新值的情况,只要它是在初始化程序中完成的。
为了更好地理解初始化的工作原理,我建议您阅读相应的文档:Initialization