我正在尝试从远程通知的 userInfo 字典中提取角标(Badge)值。 我阅读了很多帖子并找到了我的问题的解决方案,但我非常不满意!
这是我的数据结构(我删除了无用的行):{ aps = { badge = 7 } }
要从我的 userInfo
中提取这个数字“7”,我想执行以下操作:
self.updateAppIcon(userInfo["aps"]["badge"] as? Int)
但是我当然会收到以下错误:
Swift:“(NSObject, AnyObject)”没有名为“subscript”的成员
如果我没记错的话,那是因为 []
返回一个 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
}
但是说真的……我可以用更性感的方式来做吗?更少的行,更少的 if 子句,更少的转换等等?这是一件简单事情的“代码复杂”解决方案。
谢谢
最佳答案
最短的是:
// 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]
是......我不知道 :( .一个错误,也许。
关于ios - swift : '(NSObject, AnyObject)' does not have a member named 'subscript' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26508044/