2017-09-27 20 views
1

におけるプロトコルcomformするTをキャストすることができます:は、私は以下のコード・ショーとして迅速ジェネリックを使用したい迅速

protocol B { 
    ... 
} 

Bがプロトコルである...

func handle<T>(data: Data, with type: T.Type) { 
    if type is B.Type { 
     handleOne(data: data, with: type) //error here: In argument type 'T.Type', 'T' does not conform to expected type 'B' 
     // cast T comform B? 
    } else { 
     handleTwo(data: data) 
    } 
} 

func handleOne<T>(data: Data, with type: T.Type) where T:B { 

} 

func handleTwo(data: Data) { 

} 

を、私はhandlehandleOneを呼び出すことができます?キャスト可能T comform B

+0

コンパイラ**はタイプがB.Type'であれば '知るには十分**スマートではありませんtrue'には、次に入力し'です実際にはタイプBである。あなたの 'handleOne'関数には' B'型が必要なので、これは失敗します! – Honey

+0

私はXcode9 swift4で試してみましたが、 'struct A:B {}'、 'handle(data:Data()、with:A.self) '、'型がB.Typeならば'true'、あなたはこれを試すことができます –

答えて

2

オブジェクト自体から取得できるので、型としてパラメータとして渡す必要はありません。チェックオペレータはタイプ名に対してオブジェクトやチェックのインスタンス上で動作しますisタイプ:

protocol A {} 

protocol Data {} 

func handle (data: Data) { 
    if data is A { 
    print("Handled A.") 
    } else { 
    print("Handled something else.") 
    } 
} 

struct AStruct: Data, A {} 

handle(data: AStruct()) // Handled A. 
+0

私の質問では、' handleOne 'は' .Type'パラメータが必要です。 –

+0

これは動作するはず: 'FUNC (データ:T)ハンドル((タイプ::でデータ、データデータ))データは{ handleOneある場合{ を }他{ プリント( "何かを担当。" ) } } –

+0

また、タイプ(of:data)の代わりにT.selfを使用することもできます。 –