2016-09-05 8 views
7
protocols.forEach { $0.prop = nil } 

परिणाम हैforeach परिणाम अपरिवर्तनीय त्रुटि में

protocols.forEach 
{ 
    var protocol = $0 

    protocol.prop = nil 
} 

लेकिन क्यों संकलक इस के साथ ठीक है? मुझे उम्मीद है कि यह इसे समझ सकता है।

+0

ऑब्जेक्ट्स स्ट्रक्चर या क्लास का उदाहरण हैं? – vacawama

+0

@ वाकावामा नहीं, पूछने के लिए धन्यवाद, वे वास्तव में 'प्रोटोकॉल' हैं। –

+0

अपने प्रोटोकॉल में '" क्लास "जोड़ें, यदि आपके प्रोटोकॉल को लागू करने वाली हर चीज एक वर्ग है, और यह काम करेगी। – vacawama

उत्तर

17

आपके पास प्रोटोकॉल को लागू करने वाली वस्तुओं की एक श्रृंखला है। यदि आप स्विफ्ट को यह नहीं बताते कि यह class प्रोटोकॉल है, तो यह मान लेगा कि इसे struct द्वारा कार्यान्वित किया जा सकता है।

एक forEach पाश में, आप अनिवार्य रूप से एक let चर (डिफ़ॉल्ट रूप से $0 कहा जाता है) बारी में सरणी में प्रत्येक मान करने के लिए आवंटित होगा। यदि आपके पास ऑब्जेक्ट्स (कक्षा के उदाहरण) की एक सरणी है, तो आप उस आइटम के गुणों को संशोधित कर सकते हैं। यदि आपके पास struct आइटमों की एक सरणी है, तो वे अपरिवर्तनीय होंगे। यदि आपके पास प्रोटोकॉल को लागू करने वाली वस्तुओं की एक श्रृंखला है, तो स्विफ्ट उन्हें अधिक प्रोटोकॉल struct के रूप में तब तक मानेंगे जब तक कि आप अपनी प्रोटोकॉल परिभाषा में : class जोड़ते हैं।

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

protocol Xyzzy: class { 
    var prop: Int? { get set } 
} 

class Fred: Xyzzy, CustomStringConvertible { 
    var description: String { return "\(prop)" } 
    var prop: Int? = 17 
} 

let objects: [Xyzzy] = [Fred(), Fred(), Fred()] 

print(objects) // [Optional(17), Optional(17), Optional(17)] 

objects.forEach { $0.prop = nil } 

print(objects) // [nil, nil, nil] 

आपका वैकल्पिक हल: वर्ग वस्तुओं के लिए

protocols.forEach 
{ 
    var protocol = $0 

    protocol.prop = nil 
} 

काम करता है क्योंकि यह वस्तु के लिए एक नया var सूचक बनाता है, और फिर यह है कि आप वस्तु को संशोधित करने की अनुमति देता है। ध्यान दें, यह कामकाज केवल कक्षाओं के उदाहरणों के लिए काम करता है। यदि आपका प्रोटोकॉल struct द्वारा कार्यान्वित किया गया है, तो नया varstruct आइटम की एक नई प्रतिलिपि होगी, और सरणी में मूल वाले नहीं बदले जाएंगे।

+0

महान उत्तर जो स्विफ्ट की गहरी समझ प्राप्त करने में मदद करता है। धन्यवाद! –

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