2017-05-09 3 views
1

を持って保証型の制約を定義する方法:スウィフトは - I型コード、次のしているのinit

struct MyStruct { 
    var v: Int = 1 
} 

func createInstance<T: Any>(type: T.Type) -> T 
{ 
    return type.init() 
} 

let myType = MyStruct.self 
let instance = createInstance(type: myType) 

私が保証するものではありませんので、これは動作しませんが、Tは、initを持っています。

Playground execution failed: error: MyPlayground.playground:76:12: error: type 'T' has no member 'init' 
return type.init() 
     ^~~~ ~~~~ 

しかし、型にinitがあることを保証するための制約をどのように定義できますか?

+0

これらの構造体とクラスで実装する必要がある「初期化可能」プロトコルを使用できますか? – NRitH

+0

実装する必要がある空のプロトコルだけを意味しますか?うーん、少し奇妙ですが、それは素晴らしいトリックのように聞こえる:)私はそれを試してみましょう。 – Dareon

+0

'createInstance(type:)'で達成しようとしていることは何ですか?標準ライブラリには 'DefaultConstructible'(または同様の)プロトコルがないという理由があります。セマンティクスを伴わずに*ただ*初期化できることは意味がありません。私は[Protocols is Syntax of Bags](https://oleb.net/blog/2016/12/protocols-have-semantics/)の読書をお勧めします。 – Hamish

答えて

2

あなたinit()方法を青写真カスタムプロトコルを構築し、あなたのcreateInstance機能におけるジェネリックtypeholderの型制約として、このプロトコルを使用することができます。例えば:(明示的)上記createInstance方法を利用することができるであろうSimplyInitializableに準拠

protocol SimplyInitializable { 
    init() 
} 

struct MyStruct: SimplyInitializable { 
    var v: Int = 1 
} 

func createInstance<T: SimplyInitializable>(type: T.Type) -> T 
{ 
    return type.init() 
} 

let myType = MyStruct.self 
let instance = createInstance(type: myType) 

タイプ(SimplyInitializableからMyStructの適合性に注意してください)。上記のアプローチに代わるものとして


、あなたは同様に、あなたがしたい場合は、SimplyInitializableに準拠型のインスタンスを作成するために、一般的なstructの使用ではなく、世界的なジェネリックcreateInstanceメソッドを作ることができます。例:

protocol SimplyInitializable { 
    init() 
} 

struct SimpleFactory<T: SimplyInitializable> { 
    static func createInstance() -> T { 
     return T.init() 
    } 
} 

struct MyStruct: SimplyInitializable { 
    var v: Int = 1 
} 

let instance = SimpleFactory<MyStruct>.createInstance() 
+0

パーフェクト、私は間違ってfunc init()でプロトコルを試しました。ありがとうございました。 – Dareon

+0

@Dareonがお手伝いします。上記の質問へのコメントで、Hamishがリンクしている関連性の高い関連するブログ記事をご覧ください。上記の答えは、技術的にはあなたが求めている機能を達成できることを示していますが、ブログ記事では、上記のSimplyInitializableなどのプロトコルが意味値が非常に悪い理由について議論しています。スウィフトのstdlibsで。 – dfri

関連する問題