2017-03-12 18 views
0

クラスを作成して、関数aを呼び出した後にそのサブクラスが型Selfの新しいオブジェクトを受け取るようにしたいと思います。私は、サブクラスにinit()メソッドがあることを保証しています。私は、オブジェクトのクローンを作成したいが、私は、元の変更された値を持つクローンを作成したいので、実際には、それ以上ですので、私は本当にswiftyコピーコンストラクタ構文Swiftのinitの外でインスタンス化する

を使用しないようにして

なぜ機能しないのですか?間違いなく:

func myCustomCopy(modificationCommand: Command) -> Test { 
    let newInt = modificationCommand.execute(self.myInt) 
    return Test(newInt: newInt) 
} 

は私が望むものではありません。

例:

protocol Testable { 
    var myInt: Int { get set } 
    init(newInt: Int) 
} 

class Test: Testable { 
    var myInt = 10 
    required init(newInt: Int) { myInt = newInt } 

    func myCustomCopy(modificationCommand: Command) -> Self { 
     let newInt = modificationCommand.execute(self.myInt) 
     return self.init(newInt: newInt) 
    } 
} 
+1

1)なぜあなたは何を望んでいないのですか? – Alexander

+0

2)最初に関数 'a()'が必要なのはなぜですか? – Alexander

+0

3) 'a()'関数を完全に削除すると、最後のコードスニペットは完全に問題ありません。すべてのサブクラスはそのイニシャライザを持つ必要があります。サブクラス – Alexander

答えて

1

あなたはメタタイプの具体的なタイプの初期化子にアクセスするためにtype(of:)によって返された(動的型付け)メタタイプを使用することができます。 Language Reference - Metatypes

を引用することは そのタイプのメタタイプ値から型のインスタンスを構築するために初期化子式を使用します。クラスインスタンスの場合、呼び出される の初期化子には、requiredキーワード、または クラス全体が最後のキーワードでマークされている必要があります。

だからあなたの場合には、あなたは、例えば、selfの具体的な種類のrequired初期化子を呼び出すためにselfのメタタイプを使用することができますあなたは非finalクラスで作業していることから、上記の引用に指定されている、初期化子はrequiredいずれかでなければなりません

func myCustomCopy() -> Self { 
    return type(of: self).init() 
} 

注意。

関連する問題