我想比较来自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对象的正确方法吗?
任何答案都将不胜感激!
答案 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的角度来看,因为它的功能是将更改集中到数据库记录中。这并不意味着数据库中没有任何人的重复信息。因此,对象模型的各种观点的平等概念存在差异。