protocols.forEach { $0.prop = nil }
परिणाम हैforeach परिणाम अपरिवर्तनीय त्रुटि में
protocols.forEach
{
var protocol = $0
protocol.prop = nil
}
लेकिन क्यों संकलक इस के साथ ठीक है? मुझे उम्मीद है कि यह इसे समझ सकता है।
protocols.forEach { $0.prop = nil }
परिणाम हैforeach परिणाम अपरिवर्तनीय त्रुटि में
protocols.forEach
{
var protocol = $0
protocol.prop = nil
}
लेकिन क्यों संकलक इस के साथ ठीक है? मुझे उम्मीद है कि यह इसे समझ सकता है।
आपके पास प्रोटोकॉल को लागू करने वाली वस्तुओं की एक श्रृंखला है। यदि आप स्विफ्ट को यह नहीं बताते कि यह 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
द्वारा कार्यान्वित किया गया है, तो नया var
struct
आइटम की एक नई प्रतिलिपि होगी, और सरणी में मूल वाले नहीं बदले जाएंगे।
महान उत्तर जो स्विफ्ट की गहरी समझ प्राप्त करने में मदद करता है। धन्यवाद! –
ऑब्जेक्ट्स स्ट्रक्चर या क्लास का उदाहरण हैं? – vacawama
@ वाकावामा नहीं, पूछने के लिए धन्यवाद, वे वास्तव में 'प्रोटोकॉल' हैं। –
अपने प्रोटोकॉल में '" क्लास "जोड़ें, यदि आपके प्रोटोकॉल को लागू करने वाली हर चीज एक वर्ग है, और यह काम करेगी। – vacawama