Swift で NSObject を継承したクラスに Hashable プロトコルを適応したい
Objective-C のライブラリを Bridging Header を使って、swift から使っている時の話です。
状況
- NSObject を継承したクラスを継承している
- そのクラスに
Hashable
プロトコルを適応しようとする
エラー
Redundant conformance of 'Marker' to protocol 'Hashable'
このエラーは、すでに使用しているプロトコルを、再度継承しようとした時に起こります。
つまり、GMSMarker
はすでに Equatable
か、Hashable
を継承している、ということになる
ただし、Swift のコードを見る限り、継承はしていない。
原因
NSObject
が、Hashable
の機能を最初から持っている
解決策
Objective-C の実装を使用する
class Marker: GMSMarker { // MARK: Hashable objective-c implementation override var hashValue: Int { get { return userData.hashValue } } override func isEqual(object: AnyObject?) -> Bool { guard let marker: Marker = object as? Marker else { return false } return userData == marker.userData } }
userData
で hashValue
を計算していることに深い意味はありません、適当に重複しなさそうな計算式を当ててください。