2014-09-05 6 views
8

क्या कोई इस त्रुटि को समझा सकता है और यह बंद होने के साथ क्यों काम करता है?प्रोटोकॉल विधि के आंशिक अनुप्रयोग की अनुमति नहीं है

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

बीटा 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

अगर आप किसी के बारे में कुछ विचार किया है टिप्पणी करने के लिए संकोच न करें।

+0

चूंकि एक्सकोड 7 बीटा 2 यह काम कर रहा है –

उत्तर

3

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

aString = { return a.someFunc() } 
+0

मेरे लिए काम किया! बहुत बढ़िया। – DudeOnRock

7

अद्यतन (धन्यवाद लैस्ज़लो को लघु)

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

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

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 के संदर्भ में है। लेकिन संरचनाएं और गणना संदर्भ प्रकार नहीं हैं, वे मूल्य प्रकार हैं और a का कोई संदर्भ नहीं है।

+0

महान स्पष्टीकरण के लिए धन्यवाद। मुझे लगता है कि यह दुखद है हालांकि। –

+1

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

संबंधित मुद्दे