2014-08-30 5 views
6

मैं टाइप (NSObject, AnyObject) प्रकार String पर किसी ऑब्जेक्ट को कैसे परिवर्तित करूं?'(NSObject, AnyObject)' 'स्ट्रिंग' 0 परिवर्तनीय नहीं है

नीचे दी गई विधि की पहली पंक्ति के अंत में, as String संकलक त्रुटि होती है:

'(NSObject, AnyObject)' is not convertible to 'String' 

String compiles के बजाय NSString में कास्ट करना street, लेकिन मैं String को street कास्टिंग रहा हूँ क्योंकि मैं चाहता हूँ इसकी तुलना placemark.name से करें, जिसमें String! है, NSString नहीं है।

मैं जानता हूँ कि name और street optionals हैं, लेकिन मैं यह सोचते कर रहा हूँ वे क्योंकि सभी स्थानों MKLocalSearch से लौटे अब के लिए nil नहीं कर रहे हैं गैर शून्य के नाम और सड़कों लगता है।

func formatPlacemark(placemark: CLPlacemark) -> (String, String) { 
    let street = placemark.addressDictionary["Street"] as String 
    if placemark.name == street { 
     // Do something 
    } 
} 

उत्तर

6

एक String एक वस्तु है, तो आप एक NSString करने के लिए इसे कास्ट करने के लिए जरूरत नहीं है। मैं इसे कास्ट करने के लिए निम्नलिखित वाक्यविन्यास की सिफारिश करता हूं और इसे एक ही समय में खोलता हूं। String! प्रकार के एक चर के साथ तुलना करने की चिंता न करें क्योंकि वे संगत हैं। यह काम करेगा:

func formatPlacemark(placemark: CLPlacemark) -> (String, String) { 
    if let street = placemark.addressDictionary["Street"] as? NSString { 
     if placemark.name == street { 
      // Do something 
     } 
    } 
} 

यह अतिरिक्त लाभ यह है कि अगर "स्ट्रीट" ऑब्जेक्ट प्रकार अपने शब्दकोश में या यदि किसी मान्य कुंजी नहीं है NSString के अलावा कुछ है नहीं है, यह क्रैश नहीं करेंगे। यह सिर्फ ब्लॉक में प्रवेश नहीं करेगा।

आप वास्तव में सड़क एक String आप ऐसा कर सकता है होना चाहते हैं:

if let street:String = placemark.addressDictionary["Street"] as? NSString 

लेकिन यह आपको इस मामले में कुछ नहीं खरीदती।

+0

आप कैसे जानते हैं कि मैं 'स्थलचिह्न कर सकता हूं।'street.isEqualToString (placemark.name)' के बजाय नाम == सड़क' '? मैं यह सुनिश्चित करना चाहता हूं कि मैं स्ट्रिंग समानता ('isEqualToString') की जांच कर रहा हूं, पहचान की वस्तु नहीं (' == ')। – ma11hew28

+0

स्विफ्ट स्वचालित रूप से दो प्रकार के बीच पुल, और '==' स्ट्रिंग समानता परीक्षण का स्विफ्ट तरीका है। देखें: https://developer.apple.com/library/prerelease/mac/documentation/Swift/Conceptual/BuildingCocoaApps/WorkingWithCocoaDataTypes.html – vacawama

+0

इसे Playground में आज़माएं। आप इसे देखना चाहेंगे जैसा आप चाहें। – vacawama

1

मुझे लगता है कि यह addressDictionary जा रहा है एक NSDictionary से कोई लेना देना पड़ सकता है।

यदि आप addressDictionary को स्विफ्ट शब्दकोश में कनवर्ट करते हैं, तो इसे काम करना चाहिए।

let street = (placemark.addressDictionary as Dictionary<String, String>)["String"] 
+0

लेकिन, यह [@ वैकवामा के समाधान] से धीमा है (http://stackoverflow.com/a/25582668/242933)? क्योंकि 'एनएस डिक्शनरी' से पूरी तरह से 'डिक्शनरी' अलग नहीं है? तो, इसका मतलब 'NSDictionary' को 'शब्दकोश' में डालने का मतलब होगा, कार्यक्रम को पूरी तरह से नया 'शब्दकोश' ऑब्जेक्ट बनाना होगा और इसे मूल' NSDictionary' की चाबियों और मानों से भरना होगा? यह सिर्फ एक साधारण कलाकार की तुलना में अधिक काम की तरह लगता है। – ma11hew28

+0

यह सुरक्षित नहीं है। यदि शब्दकोश में कोई भी मान 'NSString' के अलावा कोई ऑब्जेक्ट है, तो यह ऐप को क्रैश कर देगा। आप केवल तभी ऐसा करेंगे यदि आप 100% सुनिश्चित थे कि सभी ऑब्जेक्ट्स 'एनएसएसटींग' थीं, और फिर आप इसे केवल एक बार करेंगे, जब डेटा पहले बनाया जाएगा। यदि आप 'NSDictionary' प्राप्त करने के लिए अपने ऐप के बाहरी एपीआई को कॉल कर रहे हैं, तो प्रत्येक ऑब्जेक्ट को टाइप कास्ट ऑपरेटर (' as? ') के वैकल्पिक रूप से जांचना सुरक्षित होगा। – vacawama

2

वापसी प्रकार एक तेज शब्दकोश के लिए सबस्क्रिप्ट के माध्यम से देख से के बाद से वहाँ किसी कुंजी के लिए कोई मूल्य नहीं हो सकता है एक वैकल्पिक हो गया है।

वजह आप कार्य करना होगा:

as String? 
+1

'स्ट्रिंग के रूप में? 'एक ही संकलक त्रुटि देता है। – ma11hew28

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