のEquatable機能を呼び出すことはありません - objectIdsとをこのように比較するためのEquatable機能の実装とMYUSERクラス:スウィフトArray.contains()私は<strong>PFUser</strong>のサブクラス持っPFUserサブクラス
func ==(left: MYUser, right: MYUser) -> Bool {
return left.objectId == right.objectId
}
しかし、Array.contains()メソッドを呼び出すと、この実装はEquatable関数と呼ばれ、誤った結果につながります。例えば、ここに:
let hasUser = self.selectedUsers.contains(currentUser)
hasUserは偽場合selectedUsersが配列が異なるメモリオブジェクトが含まれていますが、あるCurrentUserと同じOBJECTIDとなりました。
興味深いことに、Equatable関数の実装が直接使用されています。ここでは:正常に呼び出されました
var hasUser = false
for itUser in self.selectedUsers {
if itUser == currentUser {
hasUser = true
break
}
}
==オペレータとが異なるメモリオブジェクトのためのそれの原因となることができますどのような同じOBJECTID
と正しい値を持っているhasUser?
更新。私はこのNSObject
問題だと思う
class MYUser: PFUser {
// MARK: - Parse Object
@NSManaged var avatarFile: PFFile?
@NSManaged var fullName: String?
// MARK: - PFSubclassing Methods (through PFUser)
override class func initialize() {
struct Static {
static var onceToken : dispatch_once_t = 0;
}
dispatch_once(&Static.onceToken) {
self.registerSubclass()
}
}
}
func ==(left: MYUser, right: MYUser) -> Bool {
return left.objectId == right.objectId
}
私はParse.com経験がないが、これは関連している可能性があり:http://stackoverflow.com/questions/33319959/nsobject-subclass-in-swift-hash-vs-hashvalue-isequal-vs - '=='ではなく 'isEqual:'をオーバーライドしてみてください。 –
@MartinR ParseとObjCの相互運用性は唯一の問題ではないと思います。純粋なSwift MWEを作成し、サブクラスの '=='のオーバーロードは 'contains'で呼び出されません。 –
それは関係ないかもしれませんが、あなたは私のMYUserがどのように定義されているかを見せてもらえますか? –