2015-01-18 11 views
13

मैं समान प्रश्नों के माध्यम से हूं लेकिन अभी भी यह समझ में नहीं आता कि मेरा कोड एक त्रुटि क्यों फेंक रहा है।(स्ट्रिंग: AnyObject) में 'subscript' नामक सदस्य नहीं है

var dict = [String:AnyObject]() 
dict["participants"] = ["foo", "bar"] 
dict["participants"][0] = "baz" 

त्रुटि लाइन 3 पर है: (String: AnyObject) does not have a member named 'subscript'

मैं एक सरणी के लिए participants कुंजी सेट कर रहा हूं और उसके बाद किसी भी भाग्य के बिना यह के पहले तत्व अद्यतन करने के लिए कोशिश कर रहा। उदाहरण के प्रयोजनों के लिए ऊपर दिया गया कोड छोटा है, लेकिन मैं [String:AnyObject] का उपयोग कर रहा हूं क्योंकि यह केवल सरणी नहीं है जो शब्दकोश में संग्रहीत हैं।

शायद यह वास्तव में कुछ मामूली है लेकिन मैं अभी भी स्विफ्ट के लिए नया हूं। किसी भी सहायता के लिए अग्रिम धन्यवाद!

उत्तर

19

त्रुटि संदेश आपको बताता है कि समस्या क्या है। आपके शब्दकोश मानों को 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 
}() 
+0

आप व्याख्या कर सकते हैं क्यों तुम 'के रूप में' dict' टाइप किया [स्ट्रिंग: AnyObject] 'पहली जगह में? मैं यह नहीं कह रहा हूं कि ऐसा करने का कोई कारण नहीं है, लेकिन यदि हर मूल्य स्ट्रिंग की सरणी पर जा रहा है तो आप आगे भी कह सकते हैं। अन्यथा, आपको कास्ट करना होगा। – matt

+0

हाँ, क्षमा करें मुझे इसके बारे में स्पष्ट होना चाहिए था। उपर्युक्त कोड उदाहरण उद्देश्यों के लिए अधिक है लेकिन हमेशा एक सरणी नहीं होगी। कुछ मामलों में इसमें अन्य डेटा प्रकार होंगे। मैं सवाल अपडेट करूंगा। – Fenda

+0

@ फेंडा पूरी तरह से उचित; यह हमेशा होता है। लेकिन फिर आपको कास्ट करने की ज़रूरत है। मैंने प्रदर्शन करने के लिए अपना जवाब अपडेट कर दिया है। – matt

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

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