Swift:'(NSObject,AnyObject)'没有名为'下标'的成员

时间:2014-10-22 13:00:39

标签: ios dictionary swift push-notification nsobject

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

但严重的是......我能以更性感的方式做到吗?线条少,条款少,演员阵容少等等?这是一个简单的“代码复杂”解决方案。

由于

2 个答案:

答案 0 :(得分:9)

最短的是:

// 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]是......我不知道:(。。bug,也许。

答案 1 :(得分:3)

您可以使用nil coleascing运算符并将其缩短但可能会失去可读性。如果有这样的方法的单行版本,

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)
    }
}