2017-07-21 11 views
3

私はこの問題について洞察しています。私は特定のプロトコルに準拠する任意の型を受け入れるSwiftでジェネリック関数を作成しようとしています。しかし、このメソッドに準拠型を渡すと、そのクラスが準拠していないというコンパイラエラーが発生します。ここでプロトコルの適合性が汎用機能で認識されない

は私のプロトコルです:

protocol SettableTitle { 
    static func objectWithTitle(title: String) 
} 

そして、ここでは、このプロトコルに準拠して、私が作ったクラスです:

class Foo: SettableTitle { 
    static func objectWithTitle(title: String) { 
     // Implementation 
    } 
} 

は最後に、ここでは異なるクラスに住んでいる私の一般的な機能です:

class SomeClass { 
    static func dynamicMethod<T: SettableTitle>(type: T, title: String) { 
     T.objectWithTitle(title: title) 
    } 
} 

ここで、このようなメソッドを呼び出すと:

SomeClass.dynamicMethod(type: Foo.self, title: "Title string!") 

私は、次のコンパイラエラーを取得する:error: argument type 'Foo.Type' does not conform to expected type 'SettableTitle' SomeClass.dynamicMethod(type: Foo.self, title: "Title string!")

クラスFooを宣言し、SettableTitle適合性を実装したときに、これが起こる理由を私は理解できません。

これはXcode 8.3(最新の非ベータ版)の簡単な遊び場です。誰も私がここで間違っている何かを見ることができますか?

答えて

0

関数では、型ではなくSettableTitleを実装するオブジェクトが必要です。

は代わりに、あなたはT.Typeを行う必要があり、それが動作します:

class SomeClass { 
    static func dynamicMethod<T: SettableTitle>(type: T.Type, title: String) { 
    T.objectWithTitle(title: title) 
    } 
} 

出典:Using a Type Variable in a Generic

+0

これはトリックをしました!ジェネリックスの章をもう一度読まなければならないと思います。ありがとう! – Drew

関連する問題