Swift Equatable 프로토콜


85

나는 Swift에 대한이 튜토리얼을 따랐습니다 : https://www.raywenderlich.com/125311/make-game-like-candy-crush-spritekit-swift-part-1 그리고이 코드를 발견했습니다 :

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

정확히 썼지 만 Xcode는 다음과 같은 오류를 제공합니다.

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

Apple 문서에서이 코드를 찾았습니다 : https://developer.apple.com/documentation/swift/equatable

제가 쓴 것과 매우 비슷합니다. 뭐가 문제 야? 이것은 나에게 버그처럼 보입니다. Xcode 6 Beta 2를 사용하고 있습니다.

편집하다:

이것은 내 전체 Cookie 클래스입니다.

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

그 진술 앞의 코드는 무엇입니까? 그것은 저에게 잘 작동합니다
Connor

나는 설명에 전체 클래스를 추가
애디슨

8
"선언 연산자는 전역 범위에서만 허용됩니다." 이것은 Swift의 더 나은 컴파일러 오류 메시지 중 하나입니다!
matt

1
파일 범위 에서만 연산자를 오버로드 할 수 있습니다 .
holex

2
당신은 이동해야 func ==(lhs: Cookie, rhs: Cookie) -> Bool {...}쿠키 클래스의 OUT!
Hlung

답변:


145

이 기능을 이동

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

쿠키 클래스 외부. 두 개의 쿠키에서 사용될 때 전역 범위에서 == 연산자를 재정의하기 때문에이 방법이 의미가 있습니다.


3
xCode 6.3.2 및 swfit 1.2에 추가하고 싶습니다. func ==는 클래스 또는 구조체 정의 바로 뒤에 있어야합니다. "var a = 1"과 같은 간단한 문장을 추가해도 컴파일러 오류가 발생합니다.
fangmobile

2
나는 그것을 수업 밖에 두려고 생각하지 않았을 것입니다 ! 그게 뭐죠? Google에서 어떻게 찾나요?
rr1g0 2015

1
거기 운영자 과부하 전역에있는 이유에 대한 설명은 가능한 변경이 운영자 구현이 유형의 내부에 있도록 논의되고 있지만,.

32

SWIFT 2 :

스위프트 2에서 NSObject이미 Equatable. 당신은.

class Cookie: NSObject {
    ...

}

그리고 당신은 isEqual방법 을 재정의해야합니다.

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
    }

}

이 시간 isEqual메서드는 클래스 내부에 있습니다. :)

SWIFT 3 편집 : 이 방법을 다음과 같이 변경하십시오 .

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

        return lhs.column == rhs.column
    }

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.