Swift:'(NSObject,AnyObject)'没有一个名为'subscript'的成员
我试图从远程通知的userInfo字典中提取徽章值。 我读了很多post,发现了我的问题的解决scheme,但我很不满意!
所以这里是我的数据结构(我删除了无用的行): { aps = { badge = 7 } }
为了从我的userInfo
提取这个数字'7',我想要做到以下几点:
self.updateAppIcon(userInfo["aps"]["badge"] as? Int)
但是,我当然得到以下错误:
Swift:'(NSObject,AnyObject)'没有一个名为'subscript'的成员
如果我没有错,那是因为[]
返回一个不能被解释为另一个字典的AnyObject。
一个工作解决scheme将是做到以下几点:
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 }
但是认真的…我能以一种更性感的方式去做吗? 更less的线条,更less的条款,更less的演员等? 这是一个简单的“代码复杂”解决scheme。
谢谢
最短的是:
// 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"]
称为“可选链” 。 你需要这个,因为userInfo["aps"]
可以返回nil
。 你不必把它转换成[String : AnyObject]
因为每个AnyObject
都有'下标'成员。
而且,为什么我们在Xcode 6.0.1中需要[ ... ][0]
是…我不知道:( .a错误,也许。
你可以使用零冒号的操作符,并使其短,但你可能会失去可读性。 如果有像这样的单行版本的方法,
func handleRemoteNotification(userInfo: [NSObject : AnyObject]) { if let badge = ((userInfo["aps"] as? [String: AnyObject]) ?? ([String: AnyObject]()))["badge"] as? Int{ self.updateAppIconBadgeNumber(badge) } }
你可以使用typealias [String:AnyObject],使它看起来更可读。
typealias Dict = [String: AnyObject] func handleRemoteNotifiation(userInfo: [NSObject : AnyObject]) { if let badge = ((userInfo["aps"] as? Dict) ?? Dict())["badge"] as? Int{ self.updateAppIconBadgeNumber(badge) } }