Schnelles gleichwertiges Protokoll

85

Ich folgte diesem Tutorial für Swift: https://www.raywenderlich.com/125311/make-game-like-candy-crush-spritekit-swift-part-1 und stieß auf diesen Code:

func == (lhs: Cookie, rhs: Cookie) -> Bool {
    return lhs.column == rhs.column && lhs.row == rhs.row
}

Ich habe genau das geschrieben, aber Xcode gibt mir folgende Fehler:

Consecutive declarations on a line must be separated by ';'
Expected declaration operators are only allowed at global scope

Ich habe diesen Code aus der Apple-Dokumentation gefunden: https://developer.apple.com/documentation/swift/equatable

Welches ist sehr ähnlich zu dem, was ich geschrieben habe. Was ist los mit dir? Das scheint mir ein Fehler zu sein. Ich benutze Xcode 6 Beta 2

BEARBEITEN:

Dies ist meine gesamte Cookie-Klasse:

class Cookie: Printable, Hashable {
    var column: Int
    var row: Int
    let cookieType: CookieType
    let sprite: SKSpriteNode?
    
    init(column: Int, row: Int, cookieType: CookieType) {
        self.column = column
        self.row = row
        self.cookieType = cookieType
    }
    
    var description: String {
        return "type:\(cookieType) square:(\(column),\(row))"
    }
    
    var hashValue: Int {
        return row * 10 + column
    }
    
    func ==(lhs: Cookie, rhs: Cookie) -> Bool {
        return lhs.column == rhs.column && lhs.row == rhs.row
    }
}
Addison
quelle
Wie lautet der Code vor dieser Anweisung? Es funktioniert gut für mich selbst
Connor
Ich habe die ganze Klasse zur Beschreibung hinzugefügt
Addison
8
"Deklaration Operatoren sind nur im globalen Geltungsbereich zulässig" Ziemlich klar. Dies ist eine der besseren Compiler-Fehlermeldungen von Swift!
Matt
1
Sie können einen Operator nur im Dateibereich überladen .
Holex
2
Sie müssen func ==(lhs: Cookie, rhs: Cookie) -> Bool {...}die Cookie-Klasse verlassen !!
Hlung

Antworten:

145

Verschieben Sie diese Funktion

func == (lhs: Cookie, rhs: Cookie) -> Bool {
    return lhs.column == rhs.column && lhs.row == rhs.row
}

Außerhalb der Cookie-Klasse. Dies ist auf diese Weise sinnvoll, da der Operator == im globalen Bereich überschrieben wird, wenn er für zwei Cookies verwendet wird.

Connor
quelle
3
Ich möchte hinzufügen, dass unter xCode 6.3.2 und swfit 1.2 func == unmittelbar nach der Klassen- oder Strukturdefinition stehen muss. Selbst das Hinzufügen eines einfachen Satzes wie "var a = 1" bringt den Compilerfehler zurück.
fangmobile.com
2
Ich hätte nie gedacht, es außerhalb der Klasse zu platzieren! Wie heißt das überhaupt? Wie finde ich es bei Google?
rr1g0
1
Es gibt eine Erklärung dafür, warum die Operatorüberladung im globalen Bereich liegt , obwohl eine mögliche Änderung diskutiert wird, damit die Operatorimplementierung innerhalb des Typs liegt.
32

SWIFT 2:

Wie in Swift 2 NSObjectbereits konform mit. EquatableSie brauchen keine Konformität oben, also ist es wie

class Cookie: NSObject {
    ...

}

Und Sie müssen die isEqualMethode als überschreiben

class Cookie:NSObject{
    var column: Int
    var row: Int

    //..........

    override func isEqual(object: AnyObject?) -> Bool {
        guard let rhs = object as? Cookie else {
            return false
        }
        let lhs = self

        return lhs.column == rhs.column
    }

}

Diese isEqualZeitmethode befindet sich innerhalb der Klasse. :) :)

BEARBEITEN für SWIFT 3: Ändern Sie diese Methode als

override func isEqual(_ object: AnyObject?) -> Bool {
        guard let rhs = object as? Cookie else {
            return false
        }
        let lhs = self

        return lhs.column == rhs.column
    }
Anish Parajuli 웃
quelle
6

Die Klasse zu einem NSObject zu machen, löste die für mich gleichwertigen Probleme ...

class Cookie: NSObject {
...
}

(habe den Tipp aus den Tutorials für iOS-Lehrlinge erhalten)

Felipe Ignacio Noriega Alcaraz
quelle
1
Dies liegt daran, dass NSObject in Zeile 70 des NSObject swiftDoc Folgendes implementiert extension NSObject : Equatable, Hashable.
Adrian Sluyters