2015-05-21 9 views
34

मैं NSUserDefaults के साथ एक सरणी सहेजने की कोशिश कर रहा हूं और फिर सरणी लोड कर रहा हूं, लेकिन मुझे त्रुटि मिलती है "जेनेरिक पैरामीटर के लिए तर्क अनुमानित नहीं किया जा सकता है।" क्या मैं कुछ गलत कर रहा हूं? ऐसा लगता है कि कोई भी इस समस्या को तेज़ी से नहीं कर रहा है, इसलिए मुझे कोई समाधान नहीं मिल रहा है।जेनेरिक पैरामीटर के लिए तर्क अनुमानित नहीं किया जा सकता

IBAction func loadData(sender: AnyObject) { 
    if let testCompositeArray = defaults.objectForKey("testScoreSATArray") as? Array {   
     self.showDataLabel.text = defaults.objectForKey("testScoreSATArray") as Array 
    } 
} 

उत्तर

58

कारण आप अपने मूल त्रुटि प्राप्त है कि स्विफ्ट में, Array एक सामान्य कंटेनर कि एक विशिष्ट प्रकार के मूल्यों को धारण करता है है। तो आपके पास Array<Int> हो सकता है जिसमें पूर्णांक हो, या Array<String> स्ट्रिंग्स रखे। लेकिन आपके पास सिर्फ Array नहीं हो सकता है। सरणी में मौजूद चीज का प्रकार सामान्य पैरामीटर है, और स्विफ्ट शिकायत कर रहा है क्योंकि यह पता नहीं लगा सकता कि वह किस प्रकार का होना चाहिए। कभी-कभी यह उस प्रकार के कोड के संदर्भ से उस प्रकार का अनुमान लगा सकता है, लेकिन इस मामले में हमेशा नहीं।

आप बात आप भंडारण कर रहे हैं के प्रकार देकर समस्या का समाधान कर सकते हैं:

IBAction func loadData(sender: AnyObject) { 
    if let testCompositeArray = defaults.objectForKey("testScoreSATArray") as? Array<Int> { 

      self.showDataLabel.text = toString(testCompositeArray) 
    } 
} 
इसके बजाय Array<Int> लिखने की

, आप छोटे रूप में लिख सकते हैं, [Int]

तुम भी समस्या का समाधान कर सकते हैं जैसा कि आपने पाया है NSArray का उपयोग करके। Array के विपरीत, NSArray जेनिक्स का उपयोग नहीं करता है, क्योंकि यह उद्देश्य-सी में उत्पन्न होता है जिसमें स्विफ्ट के लिए एक अलग दृष्टिकोण होता है। इसके बजाए, NSArray में केवल एक ही चीज है, AnyObject। यह एक संदर्भ है जो किसी भी वर्ग के उदाहरणों को इंगित कर सकता है।

हालांकि, वहाँ NSArray और AnyObject का उपयोग कर, जो हर बार जब आप एक मूल्य उनमें शामिल उपयोग करते हैं, आप अक्सर एक असली बात करने के लिए मूल्य "डाली" करने के लिए, एक पूर्णांक या एक स्ट्रिंग की तरह है के लिए एक बड़ा नकारात्मक पहलू है। यह दर्द हो सकता है, और इससे भी बदतर, कभी-कभी त्रुटियों का कारण बन सकता है जब आप मानते हैं कि वास्तव में आपके पास एक और चीज है जब वास्तव में आपके पास दूसरा होता है। स्विफ्ट आमतौर पर आपको इस तरह की त्रुटियों से बचने के लिए प्रकारों के बारे में अधिक विशिष्ट होने के लिए प्रोत्साहित करता है।

+1

महान उत्तर, मुझे जेनेरिक की अवधारणा को समझने में मदद मिली ... अंत में! – DogCoffee

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

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