2014-10-22 13 views
6

मैं रिमोट अधिसूचना के उपयोगकर्ता इन्फ्लो डिक्शनरी से बैज वैल्यू निकालने का प्रयास कर रहा हूं। मैंने कई पोस्ट पढ़ी और मेरी समस्या का हल पाया लेकिन मैं बहुत संतुष्ट नहीं हूं!स्विफ्ट: '(एनएसओब्जेक्ट, एनीऑब्जेक्ट)' में 'सबस्क्रिप्ट' नामक सदस्य नहीं है

तो यहाँ

मेरी डेटा संरचना (मैं बेकार लाइनों से हटाया) है: { aps = { badge = 7 } }

मेरी userInfo से बाहर इस संख्या को निकालने के लिए '7' मैं निम्नलिखित करना चाहते हैं:

self.updateAppIcon(userInfo["aps"]["badge"] as? Int) 

लेकिन

स्विफ्ट:: जाहिर है मैं निम्नलिखित त्रुटि मिलती है '(NSObject, AnyObject)' एक सदस्य नामित किया गया है नहीं है 'सबस्क्रिप्ट'

यदि मैं गलत नहीं हूं, तो ऐसा इसलिए है क्योंकि [] कोई भी ऑब्जेक्ट देता है जिसे किसी अन्य शब्दकोश के रूप में नहीं समझा जा सकता है।

एक काम कर समाधान निम्न करने के लिए होगा:

func handleRemoteNotifiation(userInfo: [NSObject : AnyObject]) { 

    if let aps: AnyObject = userInfo["aps"] { 
     if let apsDict = aps as? [String : AnyObject]{ 
      if let badge: AnyObject = apsDict["badge"] { 
       self.updateAppIconBadgeNumber(badge as? Int) 
      } 
     } 
    } 
} 

func updateAppIconBadgeNumber(number: Int?) { 
    // do stuff here 
} 

लेकिन एक और अधिक सेक्सी रास्ते में गंभीरता से ... मैं इसे कर सकता है? कम लाइनें, अगर खंड, कम रहता है, आदि कम? यह एक आसान चीज़ का "कोड-कॉम्प्लेक्स" समाधान है।

धन्यवाद

उत्तर

9

कम से कम एक है:

// Xcode 6.0.1 
func handleRemoteNotifiation(userInfo: [NSObject : AnyObject]) { 
    if let badge = [userInfo["aps"]?["badge"]][0] as? Int { 
     self.updateAppIconBadgeNumber(badge) 
    } 
} 

// Xcode 6.1 
func handleRemoteNotifiation(userInfo: [NSObject : AnyObject]) { 
    if let badge = userInfo["aps"]?["badge"] as? Int { 
     self.updateAppIconBadgeNumber(badge) 
    } 
} 

?["aps"]["badge"] के बीच और "Optional Chaining" कहा जाता है। आपको इसकी आवश्यकता है क्योंकि userInfo["aps"]nil लौटा सकता है। और आपको इसे [String : AnyObject] पर डालना नहीं है क्योंकि प्रत्येक AnyObject में 'सबस्क्रिप्ट' सदस्य है।

और, क्यों हम Xcode 6.0.1 में [ ... ][0] की जरूरत है ... मैं नहीं पता है :(ए बग, हो सकता है।

+1

बहुत बहुत धन्यवाद!मुझे इस "वैकल्पिक चेनिंग" के बारे में कोई जानकारी नहीं थी। आपके दोनों समाधान और लिंक के लिए धन्यवाद! –

3

आप coleascing ऑपरेटर नहीं के बराबर का उपयोग करें और यह कम है, लेकिन आप पठनीयता ढीला कर सकते हैं कर सकते हैं। तो इस तरह से विधि की एक पंक्ति संस्करण,

func handleRemoteNotification(userInfo: [NSObject : AnyObject]) { 
    if let badge = ((userInfo["aps"] as? [String: AnyObject]) ?? ([String: AnyObject]()))["badge"] as? Int{ 
     self.updateAppIconBadgeNumber(badge) 
    } 
} 

है आप typealias [स्ट्रिंग: AnyObject] सकता है और यह थोड़ा और अधिक पठनीय दिखने लगता है।

typealias Dict = [String: AnyObject] 
func handleRemoteNotifiation(userInfo: [NSObject : AnyObject]) { 
    if let badge = ((userInfo["aps"] as? Dict) ?? Dict())["badge"] as? Int{ 
     self.updateAppIconBadgeNumber(badge) 
    } 
} 
+0

अपने जवाब के लिए धन्यवाद, यह वास्तव में अच्छी तरह से पूरी तरह से काम करता है, लेकिन जैसा कि के रूप में, है आप कहते हैं, कम पठनीय। @rintaro द्वारा दिया गया जवाब मेरे लिए बेहतर लगता है। लेकिन, मुझे यह बता सकता है या इस 'शून्य coleascing ऑपरेटर' '??' के बारे में एक लिंक साझा कर सकते हैं, मुझे कोई संकेत नहीं है कि यह क्या है। –

+0

' नील कोलेसिंग ऑपरेटर: ?? 'ऐप्पल के आईबुक में विस्तार से समझाया गया है। मैं इसे एक एसओ टिप्पणी में ब्लॉक-कोट नहीं कर सकता, लेकिन यहां पुस्तक की क्या सीधी प्रतिलिपि है: नील कोलेसिंग ऑपरेटर' (ए ?? बी) 'यदि कोई मान होता है तो वैकल्पिक विकल्प को अनचाहे करता है, या शून्य होने पर डिफ़ॉल्ट मान बी देता है। अभिव्यक्ति हमेशा एक वैकल्पिक प्रकार का होता है। अभिव्यक्ति बी को उस प्रकार से मेल खाना चाहिए जो कि है एक अंदर फेंक दिया। शून्य कोलेसिंग ऑपरेटर नीचे दिए गए कोड के लिए शॉर्टेंड है: 'a! = Nil? ए! : बी' – ArtSabintsev

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