Hashable プロトコルとカスタム プロトコルに対応する値を使用して Set を初期化したいと思います。
私は試した :
protocol CustomProtocol: Hashable {}
let set = Set<CustomProtocol>()
しかし、Xcode は次のように文句を言います:
プロトコル「Hashable」に準拠する具体的な型として「CustomProtocol」を使用することはサポートされていません
どうすればそれを達成できるでしょうか?
前もって感謝します。
ベストアンサー1
やりたいことができない直接的な理由は、Hashableがジェネリックプロトコルであることです。したがって、Hashable、またはそこから派生したプロトコルは、Setの要素型として使用できません。ジェネリック型は、別のジェネリックの制約としてのみ使用できます。Set<Hashable>
セットの要素型は、従うHashable へ。
最も簡単な方法は、プロトコルのセットではなく、何らかのオブジェクト タイプのセットを作成することです。たとえば、S が CustomProtocol に準拠する構造体である場合 (Hashable と 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 のセットとして定義されます。