首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swift:'(NSObject,AnyObject)‘没有一个名为’下标‘的成员

Swift:'(NSObject,AnyObject)‘没有一个名为’下标‘的成员
EN

Stack Overflow用户
提问于 2014-10-22 13:00:38
回答 2查看 8.3K关注 0票数 6

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

下面是我的数据结构(我删除了无用的行):{ aps = { badge = 7 } }

要从我的userInfo中提取这个数字'7‘,我想做以下操作:

代码语言:javascript
复制
self.updateAppIcon(userInfo["aps"]["badge"] as? Int)

但是,我当然会收到以下错误:

Swift:'(NSObject,AnyObject)‘没有一个成员名为’下标‘

如果我没有错,那是因为[]返回一个不能解释为另一个字典的AnyObject。

工作解决方案将执行以下操作:

代码语言:javascript
复制
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子句,更少的施放,等等?这是这样一个“代码复杂”的解决方案的一个简单的事情。

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-22 13:49:46

最短的是:

代码语言:javascript
复制
// 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]是..。我不知道:( .a虫,也许吧。

票数 9
EN

Stack Overflow用户

发布于 2014-10-22 13:31:34

您可以使用零着色操作符,并使其短,但您可能松散的可读性。如果有这样的方法的单行版本,

代码语言:javascript
复制
func handleRemoteNotification(userInfo: [NSObject : AnyObject]) {
  if let badge = ((userInfo["aps"] as? [String: AnyObject]) ?? ([String: AnyObject]()))["badge"] as? Int{
      self.updateAppIconBadgeNumber(badge)
  }
}

您可以键入String: AnyObject,使其看起来更加可读性更强。

代码语言:javascript
复制
typealias Dict = [String: AnyObject]
func handleRemoteNotifiation(userInfo: [NSObject : AnyObject]) {
    if let badge = ((userInfo["aps"] as? Dict) ?? Dict())["badge"] as? Int{
        self.updateAppIconBadgeNumber(badge)
    }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26508044

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档