methods - डिजाइन के सिद्धांत




प्रोटोकॉल विधि के आंशिक आवेदन की अनुमति नहीं है (2)

इसलिए, मैं ऐसा क्यों नहीं कह सकता कि ऐसा क्यों होता है, लेकिन मुझे एक वैकल्पिक हल मिल गया। इसे इस्तेमाल करे:

aString = { return a.someFunc() }

क्या कोई इस त्रुटि को समझा सकता है और क्यों यह बंद होने के साथ काम करता है?

यदि आप 'बी' कक्षा में 'ए' को 'ए' को बदलते हैं तो दोनों ही मामलों में काम करता है।

बीटा 7

protocol Test {
    func someFunc() -> String
    var someClosure: () -> Int { get }
}

class A: Test {
    func someFunc() -> String {
        return "A String"
    }

    var someClosure: () -> Int {
        return {
            return 2
        }
    }
}

class B {
    let a: Test
    let aString: () -> String
    let aInt: () -> Int

    init(a: Test){
        self.a = a

        aString = a.someFunc // Error: Partial application of protocol method is not allowed
        aInt = a.someClosure // Works fine
    }
}

अद्यतन करें

यहां भी मेरा अजीब सेगमेंटेशन गलती संग्रह है https://gist.github.com/aleksgapp/795a2d428008bdfa4823

टिप्पणी करने में संकोच मत करें यदि आपके पास किसी भी बारे में कुछ विचार हैं


अपडेट (लाज़्लो कोर्ट के लिए धन्यवाद)

स्विफ्ट 2.0 रिलीज नोट्स के साथ एक्सोडोड 7 बीटा 2 से: अब स्ट्रैक्ट्स, एनमॉम्स और प्रोटोकॉल के गैर-उत्परिवर्तन के तरीकों को उनके "स्व" पैरामीटर पर आंशिक रूप से लागू किया जा सकता है।

उदाहरण के लिए:

let a: Set<Int> = [1, 2] 
let b: [Set<Int>] = [[1], [3]]

b.map(a.union) // [[1, 2], [1, 2, 3]]

मूल उत्तर (स्विफ्ट 1.2 के साथ Xcode 6 के लिए सही)

प्रोटोकॉल कक्षा, संरचना या गणन द्वारा अपनाया जा सकता है। पिछले दो मामलों में संरचना या गणन विधि के आंशिक आवेदन की अनुमति नहीं है और आपको "प्रोटोकॉल विधि के आंशिक आवेदन की अनुमति नहीं है" क्योंकि a: Test संरचना या गणना हो सकती है

आंशिक रूप से लागू विधि या फ़ंक्शन अन्य शब्दों में है, curried method or function । इसलिए जब आप a.someFunc लिखते हैं, तो आप इस विधि को आंशिक रूप से लागू करने की कोशिश करते हैं, यानी बंद होने के संदर्भ में a.someFunc , जो कि a संदर्भ में निहित a । लेकिन संरचनाएं और एन्यूमरेशन संदर्भ प्रकार नहीं हैं, वे मूल्य प्रकार हैं और किसी के संदर्भ में नहीं हैं।





xcode6-beta7