Swift Denkleştirilebilir Protokolü


85

Swift için bu öğreticiyi takip ediyordum: https://www.raywenderlich.com/125311/make-game-like-candy-crush-spritekit-swift-part-1 ve şu kodla karşılaştım:

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

Tam olarak bunu yazdım, ancak Xcode şu hataları veriyor:

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

Bu kodu apple'ın belgelerinde buldum: https://developer.apple.com/documentation/swift/equatable

Bu yazdıklarıma çok benziyor. Sorun nedir? Bu bana bir böcek gibi görünüyor. Xcode 6 Beta 2 kullanıyorum

DÜZENLE:

Bu benim tüm Cookie sınıfım:

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
    }
}

Bu ifadeden önceki kod nedir? Benim için iyi çalışıyor
Connor

Tüm sınıfı açıklamaya ekledim
Addison

8
"beyanname Operatörlere yalnızca genel kapsamda izin verilir" Oldukça açık. Bu, Swift'in daha iyi derleyici hata mesajlarından biridir!
mat

1
bir operatörü yalnızca dosya kapsamında aşırı yükleyebilirsiniz .
holex

2
func ==(lhs: Cookie, rhs: Cookie) -> Bool {...}Cookie sınıfından çıkmanız gerekiyor !!
Hlung

Yanıtlar:


145

Bu işlevi taşı

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

Çerez sınıfının dışında. İki Çerez üzerinde kullanıldığında global kapsamda == operatörünü geçersiz kıldığı için bu şekilde mantıklıdır.


3
Bunu xCode 6.3.2 ve swfit 1.2'ye eklemek istiyorum, func == sınıf veya yapı tanımlamasından hemen sonra olmalıdır. "Var a = 1" gibi basit bir cümle eklemek bile derleyici hatasını geri getirecektir.
fangmobile

2
Bunu sınıfın dışına koymayı asla düşünmezdim ! Buna ne deniyor ki? Bunu google'da nasıl bulabilirim?
rr1g0

1
Orada operatör aşırı küresel kapsamı içindedir neden bir açıklama olası bir değişim operatör uygulama türü içinde olmasına izin tartışılıyor olsa da,.

32

SWIFT 2:

Swift olduğu gibi 2 NSObjectzaten uyan Equatablebenzediğini böylece .Arzu üstündeki uygunluğunu gerekmez

class Cookie: NSObject {
    ...

}

Ve isEqualyöntemi şu şekilde geçersiz kılmanız gerekir:

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
    }

}

Bu zaman isEqualyöntemi sınıfın içindedir. :)

SWIFT 3 için DÜZENLE: Bu yöntemi şu şekilde değiştirin :

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

        return lhs.column == rhs.column
    }

6

sınıfı bir NSObject yapmak, eşitlenebilir sorunları benim için çözdü ...

class Cookie: NSObject {
...
}

(iOS çırak eğitimlerinden ipucu aldım)


1
Bunun nedeni, NSObject'in NSObject swiftDoc'un 70. satırında aşağıdakileri uygulaması olabilir extension NSObject : Equatable, Hashable.
Adrian Sluyters
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.