Swift Equatable Protocol

IosSwiftXcode6

Ios Problem Overview


I was folling this tutorial for Swift: https://www.raywenderlich.com/125311/make-game-like-candy-crush-spritekit-swift-part-1 and came across this code:

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

I wrote exactly that, but Xcode is giving my these errors:

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

I found this code from apple's documentation: https://developer.apple.com/documentation/swift/equatable

Which is very similar to what I wrote. Whats wrong? This seems like a bug to me. I am using Xcode 6 Beta 2

EDIT:

This is my whole Cookie class:

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

Ios Solutions


Solution 1 - Ios

Move this function

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

Outside of the cookie class. It makes sense this way since it's overriding the == operator at the global scope when it is used on two Cookies.

Solution 2 - Ios

SWIFT 2:

As in swift 2 NSObject already conforms to Equatable.You don't need conformance at the top so it's like

class Cookie: NSObject {
    ...

}

And you need to override isEqual method as

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

This time isEqual method is inside the class. :)

EDIT for SWIFT 3: Change this method as

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

Solution 3 - Ios

making the class an NSObject solved the equatable problems for me...

class Cookie: NSObject {
...
}

(got the tip from the iOS apprentice tutorials)

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionAddisonView Question on Stackoverflow
Solution 1 - IosConnorView Answer on Stackoverflow
Solution 2 - IosAnish Parajuli 웃View Answer on Stackoverflow
Solution 3 - IosFelipe Ignacio Noriega AlcarazView Answer on Stackoverflow