在Swift中对NSObject进行子类化 - 使用初始化器的最佳实践

时间:2014-08-16 19:46:11

标签: ios swift initialization subclass nsobject

以下是一个示例类的布局,有人可以指导我在创建NSObject的子类时的最佳实践吗?

class MyClass: NSObject {

    var someProperty: NSString! = nil

    override init() {
        self.someProperty = "John"
        super.init()
    }

    init(fromString string: NSString) {
        self.someProperty = string
        super.init()
    }

}

这是正确的,我是否遵循此处的最佳做法?

我想知道我是否正确设置了初始值设定项(一个将字符串设置为默认值,另一个可以传递给字符串)?

我应该在每个初始值设定项的末尾调用super.init()吗?

我的更多特定(带字符串的那个)初始化程序是否应该在结尾处调用self.init()而不是super.init()

在子类化NSObject时,在Swift中设置初始值设定项的正确方法是什么? - 我该如何调用super init?

这个问题(尽管在目标C中)表明你应该有一个你总是打电话的init,只是设置更具体的属性:Objective-C Multiple Initialisers

3 个答案:

答案 0 :(得分:53)

我不是Swift忍者,但我会写MyClass为:

class MyClass: NSObject {

    var someProperty: NSString // no need (!). It will be initialised from controller 

    init(fromString string: NSString) {
        self.someProperty = string
        super.init()
    }

    convenience override init() {
        self.init(fromString:"John") // calls above mentioned controller with default name
    }        
}

请参阅initialization section of the documentation

答案 1 :(得分:2)

如果someProperty可以为nil,那么我认为你想要将属性定义为:

var someProperty: NSString?

这也消除了对自定义初始化程序的需求(至少对于此属性),因为属性在初始化时不需要值。

答案 2 :(得分:1)

作为答案的补充,一个好主意是在其他语句之前调用super.init()。我认为这对Swift来说是一个更强烈的要求,因为分配是隐含的。