比较Swift中的两个NSObject

时间:2016-01-17 05:14:06

标签: 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: Persion(), rhs: Persion() -> Bool {
     return lhs.id == rhs.id
}

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

问题是比较两个NSObject的秘诀是什么。如果我想根据他们的id比较两个人,同时从NSObject继承Person,该怎么办。

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

任何答案都将不胜感激!

3 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:1)

试试这样:

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

答案 2 :(得分:0)

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

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

如果你想让它成为一个id,只需要一个id变量并在比较中使用它。但它也可能是名称,地址和电话号码的组合。

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