我正在尝试从远程通知的userInfo字典中提取徽章值.
我看了很多帖子,发现了我的问题的解决方案,但我非常不满意!
我看了很多帖子,发现了我的问题的解决方案,但我非常不满意!
所以这是我的数据结构(我删除了无用的行):{aps = {badge = 7}}
要从我的userInfo中提取此数字’7′,我想执行以下操作:
self.updateAppIcon(userInfo["aps"]["badge"] as? Int)
但是我当然得到以下错误:
Swift:'(NSObject,AnyObject)’没有名为’下标’的成员
如果我没错,那是因为[]返回一个不能被解释为另一个字典的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 }
但是说真的……我能以更性感的方式做到吗?线条少,条款少,演员阵容少等等?这是一个简单的“代码复杂”解决方案.
谢谢
解决方法
最短的是:
// 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都有’subscript’成员.
而且,为什么我们在Xcode 6.0.1中需要[…] […]是……我不知道:(.一个bug,也许吧.