我正在尝试从远程通知的userInfo字典中提取徽章值。
我读了很多帖子,找到了解决我问题的方法,但是我非常不满意!

所以这是我的数据结构(我删除了无用的行):{ 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/

10-09 00:17