equality - protocol - swift struct equatable




Benutzerdefinierte Gleichheit bei schnellen Objekten, um die Kompatibilität mit altem Objective-C-Code zu gewährleisten (4)

In Swift können Sie Infix-Operatoren überschreiben (und sogar eigene Operatoren erstellen). Sehen Sie here .

Anstatt isEqual zu verwenden, können Sie also Folgendes tun:

myType == anotherType

In Objective-C würden Sie etwas in der Art von tun

- (BOOL)isEqual:(id)other {
    if (other == self)
        return YES;
    if (!other || ![other isKindOfClass:[self class]])
        return NO;
    return [self.customProperty isEqual:other.customProperty];
}

Mein erster naiver Versuch in kurzer Zeit lautet wie folgt

func isEqual(other: AnyObject) -> Boolean {
    if self === other {
        return true
    }
    if let otherTyped = other as? MyType {
        return self.myProperty == otherTyper.myProperty
    }
    return false
}

Aber ich bin alles andere als glücklich damit. Ich weiß nicht einmal, ob die Signatur richtig ist oder ob wir etwas anderes als isEqual .

Irgendwelche Gedanken?

BEARBEITEN: Ich möchte auch die Objective-C-Kompatibilität beibehalten (meine Klasse wird sowohl im älteren Obj-C-Code als auch im neuen Swift-Code verwendet). Daher denke ich, dass nur das Überschreiben nicht ausreicht. Liege ich falsch?


Ja, Sie müssen isEqual (und hash ) überschreiben, damit Ihre Objekte vollständig Objective-C-kompatibel sind. Hier ist ein spielplatzfähiges Beispiel für die Syntax:

import Foundation

class MyClass: NSObject {

    var value = 5

    override func isEqual(object: AnyObject?) -> Bool {
        if let object = object as? MyClass {
            return value == object.value
        } else {
            return false
        }
    }

    override var hash: Int {
        return value.hashValue
    }
}

var x = MyClass()
var y = MyClass()
var set = NSMutableSet()

x.value = 10
y.value = 10
set.addObject(x)

x.isEqual(y) // true
set.containsObject(y) // true

(Syntax aktuell ab Xcode 6.3)



Und (aber natürlich) die Signatur musste nur für swift3 geändert werden:

open override func isEqual(_ object: Any?) -> Bool {
    guard let site = object as? PZSite else {
        return false
    }
....
}