[英]compare two NSObject in Swift
我想比較來自NSObject的兩個自定義對象繼承。 例如:
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對象的正確方法嗎?
任何答案都將不勝感激!
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
}
}
在比較NSObject實例時,Swift的==
operatior會自動使用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
試試這樣:
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 managedObjects具有與其存儲對應的唯一標識符。 因此,來自CoreData中相同位置的托管對象的所有實例與CoreData的觀點“相同”,因為它的功能是將更改集中到數據庫記錄中。 這並不意味着數據庫中沒有任何人的信息重復。 因此,對象模型的各種觀點的平等概念的差異。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.