स्विफ्ट इक्विटेबल प्रोटोकॉल


85

मैं स्विफ्ट के लिए इस ट्यूटोरियल को पढ़ रहा था: 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

मुझे यह कोड सेब के प्रलेखन से मिला: https://developer.apple.com/documentation/swift/equitable

जो मैंने लिखा है, उससे बहुत मिलता-जुलता है। क्या गलत है? यह मुझे एक बग की तरह लगता है। मैं Xcode 6 बीटा 2 का उपयोग कर रहा हूं

संपादित करें:

यह मेरा पूरा कुकी वर्ग है:

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

8
"घोषणा ऑपरेटरों को केवल वैश्विक दायरे में अनुमति दी जाती है" बहुत स्पष्ट है। यह स्विफ्ट के बेहतर संकलक त्रुटि संदेशों में से एक है!
मैट

1
आप केवल फ़ाइल-स्कोप में किसी ऑपरेटर को अधिभारित कर सकते हैं ।
होलेक्स

2
आपको func ==(lhs: Cookie, rhs: Cookie) -> Bool {...}कुकी वर्ग के बाहर जाने की आवश्यकता है !!
हुलंग

जवाबों:


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" जैसे साधारण वाक्य को जोड़ने से कंपाइलर की त्रुटि वापस आ जाएगी।
फैंगमोबाइल

2
मैंने इसे कक्षा के बाहर रखने के बारे में कभी नहीं सोचा होगा ! वह भी क्या कहलाता है? मैं इसे Google पर कैसे खोजूं?
rr1g0

1
नहीं है यही कारण है कि ऑपरेटर अधिभार वैश्विक दायरे में है के बारे में एक व्याख्या हालांकि एक संभावित परिवर्तन ऑपरेटर कार्यान्वयन प्रकार अंदर हो जाने के लिए विचार-विमर्श किया जा रहा है।

32

स्विफ्ट 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 के लिए EDIT: इस विधि को इस रूप में बदलें

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

        return lhs.column == rhs.column
    }

6

कक्षा को एक NSObject बनाने से मेरे लिए समान समस्याएँ हल हो गईं ...

class Cookie: NSObject {
...
}

(iOS अपरेंटिस ट्यूटोरियल से टिप मिला)


1
ऐसा इसलिए होगा क्योंकि NSObject, NSObject स्विफ्टडॉक की लाइन 70 पर निम्नलिखित को लागू करता है extension NSObject : Equatable, Hashable
एड्रियन स्लुइटर्स ने
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.