【问题标题】:Having trouble initializing property with Swift使用 Swift 初始化属性时遇到问题
【发布时间】:2014-12-07 03:05:20
【问题描述】:

我用的是XLForm,它有一个类XLFormDescriptor,需要用init(title: String)初始化。

我要使用的标题是我当前类的名称函数的返回值(类级属性还不是一个特性)。

将其放在类级别,设置它的代码如下所示:

let settingsForm = XLFormDescriptor(title: self.name())

但这给出了错误:

'PanelController -> () -> PanelController!'没有会员 命名为“名称”

把它放在类的 init 调用的顶部看起来像这样:

let settingsForm: XLFormDescriptor

override init() {
    self.settingsForm = XLFormDescriptor(title: self.dynamicType.name())

    super.init()
}

这样做会出现此错误:

'self' 在 super.init 调用之前使用

将它放在 super.init() 之后会出现此错误:

在 super.init 调用时未初始化属性“settingsForm”

任何想法我怎么可能做到这一点?

编辑:解决方法是这样做:

let settingsForm = XLFormDescriptor(title: "")

override init() {
    super.init()
    self.settingsForm = XLFormDescriptor(title: self.dynamicType.name())
}

【问题讨论】:

    标签: ios xcode swift initialization


    【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多