Giao thức lập trình Swift


85

Tôi đã tìm hiểu hướng dẫn này cho Swift: https://www.raywenderlich.com/125311/make-game-like-candy-crush-spritekit-swift-part-1 và xem mã này:

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

Tôi đã viết chính xác điều đó, nhưng Xcode đang đưa ra những lỗi sau:

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

Tôi tìm thấy mã này từ tài liệu của apple: https://developer.apple.com/documentation/swift/equatable

Điều đó rất giống với những gì tôi đã viết. Chuyện gì vậy? Đây dường như là một lỗi đối với tôi. Tôi đang sử dụng Xcode 6 Beta 2

BIÊN TẬP:

Đây là toàn bộ lớp học Cookie của tôi:

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

Mã trước câu lệnh đó là gì? Nó hoạt động tốt đối với tôi bởi chính nó
Connor

Tôi thêm cả lớp để mô tả
Addison

8
"khai báo Các nhà khai thác chỉ được phép ở phạm vi toàn cầu" Khá rõ ràng. Đây là một trong những thông báo lỗi trình biên dịch tốt hơn của Swift!
matt

1
bạn có thể nạp chồng toán tử chỉ trong phạm vi tệp .
holex

2
Bạn cần phải di chuyển func ==(lhs: Cookie, rhs: Cookie) -> Bool {...}RA khỏi lớp Cookie !!
Hlung

Câu trả lời:


145

Di chuyển chức năng này

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

Bên ngoài lớp cookie. Nó có ý nghĩa theo cách này vì nó ghi đè toán tử == ở phạm vi toàn cục khi nó được sử dụng trên hai Cookie.


3
Tôi muốn thêm rằng trên xCode 6.3.2 và swfit 1.2, func == phải nằm ngay sau định nghĩa lớp hoặc cấu trúc. Ngay cả khi thêm một câu đơn giản như "var a = 1" sẽ mang lại lỗi trình biên dịch.
fangmobile

2
Tôi sẽ không bao giờ nghĩ đến việc đặt nó bên ngoài lớp học! Nó thậm chí còn được gọi là gì? Làm cách nào để tôi tìm thấy nó trên google?
rr1g0

1
một lời giải thích về lý do tại sao quá tải toán tử trong phạm vi toàn cầu , mặc dù một thay đổi có thể đang được thảo luận để cho phép triển khai toán tử bên trong kiểu.

32

SWIFT 2:

Như trong swift 2 NSObjectđã tuân theo Equatable. Bạn không cần tuân thủ ở trên cùng, vì vậy nó giống như

class Cookie: NSObject {
    ...

}

Và bạn cần ghi đè isEqualphương thức là

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
    }

}

isEqualPhương thức thời gian này nằm bên trong lớp. :)

CHỈNH SỬA cho SWIFT 3: Thay đổi phương pháp này thành

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

        return lhs.column == rhs.column
    }

6

làm cho lớp học trở thành NSObject giải quyết các vấn đề tương đương cho tôi ...

class Cookie: NSObject {
...
}

(có mẹo từ hướng dẫn dành cho người học việc iOS)


1
Đó là bởi vì NSObject triển khai phần sau trên dòng 70 của NSObject swiftDoc extension NSObject : Equatable, Hashable.
Adrian Sluyters
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.