ここにサンプルクラスのレイアウトがあります。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
私は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
}
}
ドキュメントの初期化セクション を参照してください
SomePropertyをnilにできる場合、プロパティを次のように定義する必要があると思います。
var someProperty: NSString?
また、このプロパティは初期化時に値を必要としないため、カスタム初期化子(少なくとも、このプロパティの場合)の必要性もなくなります。
答えを補完するために、super.init()before他のステートメントを呼び出すことをお勧めします。割り当ては暗黙的であるため、Swiftでより強力な要件だと思います。