Kev*_*ord 6 dictionary nsobject push-notification ios swift
我正在尝试从远程通知的userInfo字典中提取徽章值.我看了很多帖子,发现了我的问题的解决方案,但我非常不满意!
所以这是我的数据结构(我删除了无用的行): { aps = { badge = 7 } }
要从我的数字中提取这个数字'7',我userInfo
想做以下事情:
self.updateAppIcon(userInfo["aps"]["badge"] as? Int)
Run Code Online (Sandbox Code Playgroud)
但是我当然得到以下错误:
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
}
Run Code Online (Sandbox Code Playgroud)
但是说真的......我能以更性感的方式做到吗?线条少,条款少,演员阵容少等等?这是一个简单的"代码复杂"解决方案.
谢谢
最短的是:
// 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)
}
}
Run Code Online (Sandbox Code Playgroud)
?
之间["aps"]
和["badge"]
被称为"可选链接".你需要这个,因为userInfo["aps"]
可以返回nil
.并且您不必将其转换为[String : AnyObject]
因为每个AnyObject
都有'下标'成员.
并且,我们[ ... ][0]
在Xcode 6.0.1中需要的是......我不知道:(.一个bug,也许吧.