2016-01-17 46 views
2

我想比較兩個自定義對象從NSObject繼承。例如:比較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比較兩個Person,同時從NSObject繼承Person,該怎麼辦。

從NSObject繼承Person的好處是什麼?或者這是比較兩個人對象根據他們的id正確的方法?

任何答案將不勝感激!

+0

'FUNC ==(LHS:Persion(),RHS:Persion() - >布爾{'應該是'FUNC ==(LHS:人,RHS:人) - >布爾{'' –

+0

擴展:Equatable {}'在那裏什麼也沒有做 –

回答

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 
+0

'NSObject有一個名爲isEqual (對象:)用於比較不同的對象''這對我有很大幫助!謝謝!我忘了這個方法。 – Jacky

+1

現在,重寫的方法是'func isEqual(_ object:Any?) - > Bool {...}。 – Rob

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 
+1

謝謝你的回答,但是如果我使用array.contains(object),覆蓋是正確的,==會得到錯誤的結果 – Jacky

0

當比較一個給定的類的對象實例,它始終是決定什麼是平等之類的功能意義。它可以是它們變量的任何組合或更復雜的東西。這與NSObject或本地Swift類無關。

當你設計你的班級時,你有責任確定什麼,如果有的話,構成了平等。沒有一般規則適用於所有對象。

如果你想讓它成爲一個id,只需要一個id變量並在比較中使用它。但它同樣可以是名稱,地址和電話號碼的組合。

在另一個抽象層次上,也存在着持久性平等的概念。例如CoreData managedObjects具有與其存儲相對應的唯一標識符。因此,來自數據庫中相同位置的託管對象的所有實例與CoreData的視角「相等」,因爲它的功能是集中對數據庫記錄的更改。這並不意味着數據庫中沒有任何人的信息重複。因此,對於對象模型的各種觀點而言,平等概念的差異。