2015-11-23 5 views
6

は、次のことを考えてみましょう:where節でのプロトコルのSwift関連型?

protocol SomeProtocol { 
    typealias F: Foo 
    typealias FB: FooBar where FB.Foo == F 
} 

しかし、我々はそのようなtypealiaswhere句を置くことができないので、これはコンパイルされません。

これは簡単にこのようなtype parameterizationで行うことができますので、私はここで何かが欠けている必要があります。

struct SomeStruct<F: Foo, FB: FooBar where FB.Foo == F> {} 

associated typeためwhere句と同等とは何ですか?

+1

同様の問題は、この質問の一部です:http://stackoverflow.com/questions/33843038/define-a-swift-protocol-which-requires -a-specific-of-sequence-of-sequenceである。 –

+2

あなたは何も欠けていません。これは現在Swiftでは不可能です。 –

+0

これはレーダー経由でリクエストされています。http://openradar.appspot.com/17203060、http://www.openradar.me/21441502、swift-evolution:https://lists.swift.org/pipermail /swift-evolution/Week-of-Mon-20160229/011666.html(「*プロトコルの任意の要件」を見てください)、私は誰も進化の提案を作成していないと思います。 –

答えて

0

プロトコルの関連タイプのパラメータ化は、現在Swift(2.1)ではサポートされていません。

この場合でも、機能のためにwhere句は必要ありません。それはあなたがこれを行うことができる場所あなたが得るより多くの利便性です。

func someFunc<T: SomeProtocol>(someProt: T, foo: T.F) { 
    ... 
} 

// Instead of this: 

func someFunc<T: SomeProtocol>(someProt: T, foo: T.FB.Foo) { 
    ... 
} 
+0

まあ、そうです。しかし、これは単純化のために考案された例でした。しかし、答えをありがとう! –

+0

@DanielShinプロトコルのwhere節がうまくいく間は、ほとんどの場合、 'SequenceType 'のような汎用プロトコルが解決策になります.... Hoping for Swift 3 – Qbyte

+0

@Qbyteはい。利用可能であれば、ジェネリックプロトコルは、その質問の「ジェネリック」型式とまったく同じ意味です。それは同じ振る舞いの構文だけです。ジェネリックプロトコルのための多くの議論があり、それらに対して多くの議論があります。現実世界では、ジェネリックプロトコルなしで生き残ることが非常に簡単です。他の言語から私たちのswを翻訳するのが最悪です、私たちはできます。私はすぐに安定していることを好む、私はより良いxcodeサポート、リファクタリング、標準ライブラリのオープンソース版を探しています。次に、一般的なプロトコルは「特別なボーナス」として利用可能になります – user3441734