2014-10-12 55 views
1

我使用XLForm,它有一个类XLFormDescriptor,需要用init(title: String)进行初始化。使用Swift初始化属性时遇到问题

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

在类级别把这个,代码来设置它看起来像这样:

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

但这给出了错误:

'PanelController ->() -> PanelController!' does not have a member named 'name'

在类的init的顶部把此看起来像这样:

let settingsForm: XLFormDescriptor 

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

    super.init() 
} 

而这样做会产生此错误:

'self' used before super.init call

把它super.init()后,给出了这样的错误:

Property 'settingsForm' not initialized at super.init call

任何想法如何我都不可能做到这一点?

编辑:一种解决方法是这样:

let settingsForm = XLFormDescriptor(title: "") 

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

回答

1

在迅速,直到所有的类属性已初始化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