ios - swift : '(NSObject, AnyObject)' does not have a member named 'subscript'

标签 ios dictionary swift push-notification nsobject

我正在尝试从远程通知的 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/

相关文章:

objective-c - NSUbiquitousKeyValueStore 最大大小

ios - 未解析的标识符 "itemID"

ios - 如果您在桌面上阅读过,Facebook Messenger 如何从锁定屏幕清除推送通知?

java - 使用不存在的键加载 map ,否则加载默认值

Swift:添加方向按钮以固定注释

ios - MP3 文件无法在按钮选择上播放

swift - 取消 URLSession.AsyncBytes 的任务似乎不起作用

ios - 测试应用内购买问题。应用内购 iOS

java - 从 Map 中找到的值与相同的哈希码和等于不一致

python - Geodataframe.explore()错误: __init__() missing 1 required positional argument: 'location'