簡體   English   中英

比較Swift中的兩個NSObject

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM