あなたがしたいことをやり遂げることができない直接の理由は、Hashableが汎用プロトコルであることです。したがって、それまたはそれから派生したプロトコルはSetの要素型として使用できません。ジェネリック型は、別のジェネリックの制約としてのみ使用できます。セットの要素タイプがである必要がありますが、をHashableに準拠させる必要がある場合でも、Set<Hashable>
を宣言することはできません。
最も簡単な方法は、プロトコルのセットではなく、オブジェクトタイプのセットを作成することです。 Sは(それがハッシュ可能に準拠プラス任意の他CustomProtocolが伴うため)CustomProtocolに準拠した構造体である場合たとえば、あなたはS.のセット
例宣言することができます。
protocol CustomProtocol: Hashable {
}
func ==(lhs:S,rhs:S) -> Bool {
return lhs.name == rhs.name
}
struct S : CustomProtocol {
var name : String
var hashValue : Int { return name.hashValue }
}
let set = Set<S>()
た場合の問題、あなたにもかかわらず、何らかの形で相互に同等である混合型のコレクションを望むなら、それはプロトコル指向のWWDC 2015ビデオの議論で説明されているように、プロトコル拡張によって解決される同じ問題です。
しかし、NSObjectから派生したすべての型クラスを作成する方が簡単です。もちろん、それらにはいくつかのセカンダリプロトコルを採用させることはできますが、そのセットはそのプロトコルのセットではなくNSObjectのセットとして定義されます。
のオブジェクトは既にHashableに準拠する必要があります。 – Abizern
CustomProtocolがHashableに準拠していない場合、Xcodeはそれに準拠していないCustomProtocolについて不平を言っています。私は何かが欠けているように見えます。 –