「プロトコル…自己または関連する型の要件があるため、一般的な制約としてのみ使用できます」とはどういう意味ですか?


123

Swiftのカスタムプロトコルをキーにしたディクショナリ(実際にはHashSet)を作成しようとしていますが、タイトルにエラーがあります。

プロトコル 'myProtocol'は、Selfまたは関連する型の要件があるため、一般的な制約としてのみ使用できます

頭も尻尾も作れません。

protocol Observing: Hashable { }

var observers = HashSet<Observing>()


@jtbandesそれは重複ではありません。エラーメッセージの実際の意味を尋ねています。「自己または関連するタイプの要件」とは何ですか?
devios1 2014

回答:


90

プロトコルObservingはプロトコルから継承され、プロトコルはプロトコルからHashable継承されますEquatable。プロトコルEquatableには次の要件があります。

func ==(lhs: Self, rhs: Self) -> Bool

そして、Self内部にどこかに含まれているプロトコルは、型制約を除いてどこでも使用できません。

ここに同様の質問があります。


7
...なぜならコンパイラはどちらの側でも同じ型であることを保証する必要があるが、プロトコルはそれが契約を満たすことを保証するだけだからです。そうですか。それでも、ハッシュコードを生成するために厳密に必要なわけではないので、Equatable必ずしもそれを示唆する必要はないようEquatableです。
devios1 2014

4
ので、ああ、いや、それがない待つDictionaryニーズが指定されたオブジェクトが実際に正しいキーであるかどうかを知ることができるように、それは可能ですので、2つの異なるオブジェクトが同じハッシュコードを生成するために、。うーん、少しトリッキーです。したがって、ここでの問題は本当ににありEquatableます。
devios1 14

4
0:56を見て、Alexis Gallagherによる素晴らしいプレゼンテーション:プロトコルと
関連付けられた

@finneycanhelpこの👍👍をありがとう。素晴らしいビデオ!
devios1 2016年

11

これを解決するには、ジェネリックスを使用できます。この例を考えてみましょう:

class GenericClass<T: Observing> {
   var observers = HashSet<T>()
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.