使用Swift初始化属性时遇到问题

时间:2014-10-12 12:04:56

标签: ios xcode swift initialization

我正在使用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())
}

1 个答案:

答案 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

相关问题