web-dev-qa-db-ja.com

NSObjectのサブクラス化Swift-イニシャライザーのベストプラクティス

ここにサンプルクラスのレイアウトがあります。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()を呼び出す必要がありますか?

私のもっとspecific(文字列を取るもの)イニシャライザは、self.init()ではなく単にsuper.init()を呼び出すだけです?

NSObjectをサブクラス化するときにSwiftでイニシャライザを設定する正しい方法は何ですか?-スーパーinitを呼び出す方法は?

この質問(Objective Cではありますが)は、initが必要であることを示唆しています。initは常に呼び出し、より具体的なinitのプロパティを設定するだけです。 Objective-C Multiple Initialisers

35
Woodstock

私は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
    }        
}

ドキュメントの初期化セクション を参照してください

53
Maxim Shoustin

SomePropertyをnilにできる場合、プロパティを次のように定義する必要があると思います。

var someProperty: NSString?

また、このプロパティは初期化時に値を必要としないため、カスタム初期化子(少なくとも、このプロパティの場合)の必要性もなくなります。

2
Jed Lau

答えを補完するために、super.init()before他のステートメントを呼び出すことをお勧めします。割り当ては暗黙的であるため、Swiftでより強力な要件だと思います。

1
tontonCD