比较Swift中的两个NSObject

比较Swift中的两个NSObject,swift,Swift,我想比较从NSObject继承的两个自定义对象。e、 g: class Person: NSObject { id: Int! ... } let a = Person(1) let b = Person(1) a == b // false 这很明显,因为它们是不同的对象实例。但是我想根据他们的id来比较两个人。所以我做了这个改变: class Person { id: Int! } extension: Equatable {} func == (lhs:

我想比较从NSObject继承的两个自定义对象。e、 g:

class Person: NSObject {
     id: Int!
     ...
}

let a = Person(1)
let b = Person(1)
a == b // false
这很明显,因为它们是不同的对象实例。但是我想根据他们的
id
来比较两个人。所以我做了这个改变:

class Person {
     id: Int!
}

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

let a = Person(1)
let b = Person(1)
a == b // true
问题是比较两个对象的秘密是什么。如果我想在从NSObject继承Person时根据其id比较两个人,该怎么办

从NSObject继承人有什么好处?或者,这是根据两个人的
id
比较两个人对象的正确方法吗

任何答案都将不胜感激

试着这样做:

class Person: NSObject {
    // make your person ID immutable 
    let id: Int
    // and a required initialiser
    required init(_ id: Int) {
        self.id = id
    }
}


// make your class Person equatable
func ==(lhs: Person, rhs: Person) -> Bool {
    return lhs.id == rhs.id
}

let a = Person(1)
let b = Person(1)
a == b // true

在比较给定类的对象实例时,始终是该类的函数意义决定了什么构成相等。它可以是他们变量的任意组合,也可以是更复杂的东西。这与NSObject或本机Swift类无关

当你设计你的类时,你的责任是确定什么,如果有的话,构成平等。没有适用于所有对象的一般规则

如果您希望它是一个id,只需要有一个id变量并在比较中使用它。但也可能是姓名、地址和电话号码的组合


在另一个抽象层次上,还有持久性平等的概念。例如,CoreData ManagedObject具有与其存储相对应的唯一标识符。因此,从CoreData的角度来看,来自数据库中相同位置的托管对象的所有实例都是“相等”的,因为它的功能是集中对数据库记录的更改。这并不意味着数据库中没有任何重复的个人信息。因此,对象模型的不同透视图在相等概念上存在差异。

NSObject
有一个名为
isEqual(object:)
的方法,用于比较不同的对象。默认实现只是比较实例指针,但子类可以重写此方法来进行自定义比较

例如:

class Foo : NSObject {
    var number = 0

    override func isEqual(object: AnyObject?) -> Bool {

        if let otherFoo = object as? Foo {
            return self.number == otherFoo.number
        }
        return false
    }
}
Swift的
=
运算符在比较NSObject实例时自动使用
isEqual(object:)
方法

let foo1 = Foo()
let foo2 = Foo()
print("Equal: \(foo1 == foo2)") // true

foo1.number = 1
foo2.number = 2
print("Equal: \(foo1 == foo2)") // false

let anotherObject = NSObject()
print("Equal: \(foo1 == anotherObject)") // false

func==(lhs:Person(),rhs:Person()->Bool{
应该是
func==(lhs:Person,rhs:Person)->Bool{
扩展名:equalable{}
没有任何作用,谢谢你的回答。但是如果我使用array.contains(object),重写是正确的方法,==将得到错误的结果。
NSObject有一个名为isEqual(object:)的方法,用于比较不同的对象。
这对我帮助很大!谢谢!!我居然忘记了这个方法。现在,重写的方法是
func isEqual(\uObject:Any?)->Bool{…