比较Swift中的两个NSObject
我想比较从NSObject继承的两个自定义对象。e、 g:比较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:
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{…
。