25

以下のクラスは、型の関数FooBarをオーバーライドする必要があります。==Equatable

ただし、オブジェクトcontainsの配列を呼び出しても、カスタム関数FooBar内のブレークポイントは呼び出されません。別の関数がこのカスタム関数をオーバーライド==している可能性はありますか?==

注: FooBar は NSCoding および NSObject からサブクラス化する必要があるため、次のエラーが発生するため、FooBar は Equatable をプロトコルとしてリストしません。

「FooBar」のプロトコル「Equatable」への冗長な準拠

func ==(lhs: FooBar, rhs: FooBar) -> Bool {
    return lhs.id == rhs.id
}

class FooBar: NSObject, NSCoding {
     // Class def
}

// Both serverFooBars and gFooBars are [FooBar]
let newFooBars = serverFooBars.filter { !gFooBars.contains($0) }
4

2 に答える 2

56

クラスはから継承するため、代わりNSObjectに迅速なプロトコルを使用する必要はありません。メソッドEquatableをオーバーライドする必要があります。NSObjectisEquals

Swift 3.x 以降

class FooBar: NSObject, NSCoding {
  override func isEqual(_ object: Any?) -> Bool {
    return id == (object as? FooBar)?.id
  }
}

(カムチャツカのおかげで)

スウィフト 2.x

class FooBar: NSObject, NSCoding {
  override func isEqual(object: AnyObject?) -> Bool {
    return id == (object as? FooBar)?.id
  }
}
于 2016-05-07T07:39:50.913 に答える
4

NSObject はすでに isEqual メソッドを通じて Equatable に準拠しているため、このエラーが発生しています。

したがって、これが正しい方法かどうかはわかりませんが、NSObject の isEqual メソッドをオーバーライドできます。

class FooBar: NSObject, NSCoding {
...

override func isEqual(object: AnyObject?) -> Bool {
    return self == (object as? FooBar)
}
于 2016-05-07T07:52:00.777 に答える