2015-09-09 7 views
13

स्वचालित रूप से परिवर्तित मैं उपयोग कर रहा हूँ स्विफ्ट 2.0, मैं एक प्रोटोकॉल और प्रोटोकॉल के लिए एक विधि का एक डिफ़ॉल्ट कार्यान्वयन के लिए पर एक विस्तार है, कोड fallows के रूप में है:प्रोटोकॉल एक्सटेंशन, समारोह

protocol ColorImpressionableProtocol { 

    var lightAccentColor: UIColor? {get set} 
    var accentColor: UIColor? {get set} 
    var darkAccentColor: UIColor? {get set} 
    var specialTextColor: UIColor? {get set} 

    mutating func adoptColorsFromImpresion(impresion: ColorImpressionableProtocol?) 
} 

extension ColorImpressionableProtocol { 

    mutating func adoptColorsFromImpresion(impresion: ColorImpressionableProtocol?){ 
     lightAccentColor = impresion?.lightAccentColor 
     accentColor = impresion?.accentColor 
     darkAccentColor = impresion?.darkAccentColor 
     specialTextColor = impresion?.specialTextColor 
    } 
} 

मैं बाद में पर हूँ में इस विधि कॉल करने के लिए कोशिश कर रहा है मेरी कोड और ऐसी त्रुटि हो रही है:

"अपरिवर्तनीय मूल्य पर परिवर्तनशील सदस्य का उपयोग नहीं कर सकते हैं: 'स्वयं' अपरिवर्तनीय है"

कोड fallows के रूप में है:

init(impresion: ColorImpressionableProtocol?){ 
     super.init(nibName: nil, bundle: nil) 
     adoptColorsFromImpresion(impresion) 
} 

एकमात्र चीज जिसे मैं सोच सकता हूं वह यह है कि इस मामले में 'स्वयं' एक प्रोटोकॉल है, कक्षा नहीं। हालांकि मुझे इस अवधारणा को काम करने के लिए कुछ याद आना है, प्रोटोकॉल द्वारा परिभाषित विधि का एक डिफ़ॉल्ट कार्यान्वयन जो समान प्रोटोकॉल द्वारा परिभाषित मानों को भी संपादित करता है।

आपकी मदद और समय :)

उत्तर

28

के लिए धन्यवाद आप केवल कक्षाओं के लिए प्रोटोकॉल का उपयोग करना चाहते हैं तो आप कर सकते हैं यह एक वर्ग प्रोटोकॉल (और mutating कीवर्ड निकालने के लिए):

protocol ColorImpressionableProtocol : class { 

    // ... 

    func adoptColorsFromImpresion(impresion: ColorImpressionableProtocol?) 
} 

फिर

init(impresion: ColorImpressionableProtocol?){ 
    super.init(nibName: nil, bundle: nil) 
    adoptColorsFromImpresion(impresion) 
} 

समस्याओं के बिना संकलित करता है।

+0

मेरा मानना ​​है कि मैं जो करने की कोशिश कर रहा हूं उसके लिए यह सही वाक्यविन्यास है, परफेक्टो! धन्यवाद – CWineland

+0

मैं sanities खातिर इस पूछने के लिए ... और क्या एक वर्ग के अलावा एक प्रोटोकॉल को लागू कर सकते हैं, क्या उस के खिलाफ की रक्षा है? मुझे बस कोई अन्य परिणाम नहीं दिख रहा है, लेकिन – CWineland

+1

@CWineland के अनुरूप एक वर्ग: प्रोटोकॉल को एक संरचना द्वारा भी कार्यान्वित किया जा सकता है। –

0

संभव समाधान हैं:

1) विधि जहां प्रोटोकॉल अपनाया जा रहा है की एक गैर परिवर्तनशील संस्करण को लागू करें। यानी: प्रोटोकॉल एक्सटेंशन के रूप में कक्षा को अपनाने में विधि को कार्यान्वित करें।

2) प्रोटोकॉल को क्लास केवल प्रोटोकॉल के रूप में बनाएं। अगर आपके प्रोटोकॉल को केवल कक्षा का समर्थन करने की आवश्यकता है, तो यह सबसे आसान समाधान है।

3) यकीन है कि केवल मूल्य प्रकार अपनाने इस protocol.This सभी स्थितियों में उपयोगी नहीं हो सकता है बनाओ।

Here इस मामले के लिए विस्तृत स्पष्टीकरण और समाधान है।

+0

कृपया टिप्पणी में इस प्रकार का उत्तर जोड़ें –

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