読者です 読者をやめる 読者になる 読者になる

Swift で NSObject を継承したクラスに Hashable プロトコルを適応したい

Objective-C のライブラリを Bridging Header を使って、swift から使っている時の話です。

状況

  • NSObject を継承したクラスを継承している
  • そのクラスに Hashable プロトコルを適応しようとする
    • 僕の場合は、Google Map SDK の GMSMarker を継承した Marker オブジェクトを作っていた

エラー

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
    }
}

userDatahashValue を計算していることに深い意味はありません、適当に重複しなさそうな計算式を当ててください。