त्रुटि संदेश आपको बताता है कि समस्या क्या है। आपके शब्दकोश मानों को AnyObject के रूप में टाइप किया गया है। मुझे पता है आप जानते हैं कि यह मान एक स्ट्रिंग सरणी है, लेकिन स्विफ्ट को यह नहीं पता है; यह केवल वही जानता है जो आपने कहा था, यह एक AnyObject है। लेकिन AnyObject को सब्सक्राइब नहीं किया जा सकता है (वास्तव में, आप इसके साथ बहुत कुछ नहीं कर सकते हैं)। यदि आप सबस्क्रिप्टिंग का उपयोग करना चाहते हैं, तो आपको स्विफ्ट को यह बताना होगा कि यह कोई भी ऑब्जेक्ट नहीं है बल्कि किसी प्रकार का ऐरे है (यहां, स्ट्रिंग की एक सरणी)।
फिर दूसरी समस्या है, जो कि dict["participants"]
वास्तव में एक भी ऑब्जेक्ट नहीं है - यह वैकल्पिक किसी भी ऑब्जेक्ट को लपेटने वाला है। इसलिए आपको इसे और को छोड़ना होगा ताकि इसे सब्सक्राइब किया जा सके।
तब एक तीसरी समस्या है, जो कि आप किसी शब्दकोश के अंदर एक सरणी मान को म्यूट नहीं कर सकते हैं। आपको मूल्य निकालना होगा, इसे म्यूटेट करना होगा, और उसके बाद इसे बदलना होगा।
तो, अपने पूरे कोड इस तरह दिखेगा: विशेषज्ञों के लिए
var dict = [String:AnyObject]()
dict["participants"] = ["foo", "bar"]
var arr = dict["participants"] as [String] // unwrap the optional and cast
arr[0] = "baz" // now we can subscript!
dict["participants"] = arr // but now we have to write back into the dict
अतिरिक्त: आप चिढ़ाते हुए शांत और Swifty होना चाहते हैं (और कौन नहीं ?? करता है), तो आप प्रदर्शन कर सकते हैं उत्परिवर्तन और एक परिभाषित और कॉल अज्ञात फ़ंक्शन का उपयोग कर, इस तरह से एक चाल में काम:
var dict = [String:AnyObject]()
dict["participants"] = ["foo", "bar"]
dict["participants"] = {
var arr = dict["participants"] as [String]
arr[0] = "baz"
return arr
}()
आप व्याख्या कर सकते हैं क्यों तुम 'के रूप में' dict' टाइप किया [स्ट्रिंग: AnyObject] 'पहली जगह में? मैं यह नहीं कह रहा हूं कि ऐसा करने का कोई कारण नहीं है, लेकिन यदि हर मूल्य स्ट्रिंग की सरणी पर जा रहा है तो आप आगे भी कह सकते हैं। अन्यथा, आपको कास्ट करना होगा। – matt
हाँ, क्षमा करें मुझे इसके बारे में स्पष्ट होना चाहिए था। उपर्युक्त कोड उदाहरण उद्देश्यों के लिए अधिक है लेकिन हमेशा एक सरणी नहीं होगी। कुछ मामलों में इसमें अन्य डेटा प्रकार होंगे। मैं सवाल अपडेट करूंगा। – Fenda
@ फेंडा पूरी तरह से उचित; यह हमेशा होता है। लेकिन फिर आपको कास्ट करने की ज़रूरत है। मैंने प्रदर्शन करने के लिए अपना जवाब अपडेट कर दिया है। – matt