2016-10-14 5 views
0

NSObjectから継承するクラスを作成しようとしていますが、これは必要なパラメータを指定してのみ初期化できます。次のように私はこれを達成することができますSwift 3で特定のイニシャライザを強制する

class MyTestClass: NSObject { 
    var myTestValue: String 
    var myTestValue2: String 
    var myTestValue3: String 

    private override init() { 
     myTestValue = "" 
     myTestValue2 = "" 
     myTestValue3 = "" 
     super.init() 
    } 

    init(value: String, value2: String, value3: String) { 
     myTestValue = value 
     myTestValue2 = value2 
     myTestValue3 = value3 
     super.init() 
    } 
} 

は、クラス変数の初期化を複製することなく、これを達成するためのより良い方法はありますか?

明らかに、オプションはここではオプションですが、私はそのルートに行きたくありません。同じを達成するためのより簡潔な方法のための任意の提案?

答えて

1

私が正しく理解していれば、イニシャライザのパラメータに指定された値だけを使ってこのクラスのオブジェクトを初期化する方法を探していますか?

これで十分でしょうか?パラメータなしで呼び出す

import Foundation 

class MyTestClass: NSObject { 
    let myTestValue: String 
    let myTestValue2: String 
    let myTestValue3: String 

    init(myTestValue: String, myTestValue2: String, myTestValue3: String) { 
     self.myTestValue = myTestValue 
     self.myTestValue2 = myTestValue2 
     self.myTestValue3 = myTestValue3 
     super.init() 
    } 
} 

//... 
MyTestClass() //Disallowed 

は、このエラーを与える:Swift Language guideから

ERROR at line 16, col 12: missing argument for parameter 'value' in call 
MyTestClass() 
     ^
INFO at line 8, col 5: 'init(value:value2:value3:)' declared here 
    init(value: String, value2: String, value3: String) { 
    ^

Swift provides a default initializer for any structure or class that provides default values for all of its properties and does not provide at least one initializer itself. The default initializer simply creates a new instance with all of its properties set to their default values.

必要に応じて、あなたはまた、構造体を使用することができます。他のイニシャライザがない場合、メンバワイズイニシャライザを提供します:

struct MyTestStruct { 
    let myTestValue: String 
    let myTestValue2: String 
    let myTestValue3: String 
} 

// Implicit member-wise initializer: 
_ = MyTestStruct(myTestValue: "a", myTestValue2: "b", myTestValue3: "c") 
+0

Doh!私は 'NSObject'の' init'が引き続きアクセス可能であると仮定していたので、多くの方法を試みましたが、そうではありませんでした!私はなぜそれが理解できないのか分からない。何か案が? – doovers

+0

初期化子は継承されません。根拠については、[この質問](http://stackoverflow.com/questions/18147768/why-constructors-can-not-be-inherited-in-java)を参照してください。それはJavaですが、その考え方はSwiftにも当てはまります。 – Alexander

+0

また、私の編集を参照してください。 – Alexander

関連する問題