2016-05-25 5 views
3

プロトコル制限を持つジェネリック関数に引数を渡すときに、コンパイラの不一致が発生しているように見えます。私は、プロトコルタイプとして引数迅速な一貫性のないジェネリックプロトコル制限

protocol Selectable { 
    func select() 
} 

protocol Log : Selectable { 
    func write() 
} 

class DefaultLog : Log { 
    func select() { 
     print("selecting") 
    } 
    func write() { 
     print("writing") 
    } 
} 

let concrete = DefaultLog() 
let proto: Log = DefaultLog() 

func myfunc<T: Selectable>(arg: T) { 
    arg.select() 
} 

myfunc(concrete) // <-- This works 
myfunc(proto)  // <-- This causes a compiler error 
proto.write()  // <-- This works fine 

コンパイラレポート、具体的な引数を渡すことはできませんが、:

error: cannot invoke 'myfunc' with an argument list of type '(Log)' 
myfunc(proto) 
^ 
note: expected an argument list of type '(T)' 
myfunc(proto) 
^ 

私はそれはまだ失敗選択またはログインプロトコルに機能を制限する場合。

これはコンパイラのバグですか?何かご意見は?

答えて

1

あなたはプロトコルを使用している場合、それは一般的なことする必要はありません。

func myfunc(arg: Selectable) { 
    arg.select() 
} 

私はTは、ジェネリック医薬品のための具体的なタイプであることが必要と考えています。

+0

ああ、本当に、それは問題を回避してくれました。はい、私が他の例と分かる限り、ジェネリック型は具体的にする必要があります。ありがとう! –