我正在将我的项目升级到swift 3.0,我在userInfo [“aps”]上收到错误。我试过在它之间加上一个问号和解释点,但没有运气
private func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) {
if let aps = userInfo["aps"] as? NSDictionary {
if let alert = aps["alert"] as? NSDictionary {
if let message = alert["message"] as? NSString {
//Do stuff
}
} else if let alert = aps["alert"] as? NSString {
//Do stuff
}
}
}
答案 0 :(得分:2)
与往常一样,使用Swift集合类型,Foundation集合类型不提供有关其内容的任何类型信息。
首先使用委托方法的实际签名,将方法标记为私有,并保持旧签名是一个不妥协。但请考虑不推荐使用该方法。
func application(_ application: UIApplication, didReceiveRemoteNotification
userInfo: [AnyHashable : Any])
JSON
集合类型始终为[String:Any]
(字典)或[[String:Any]]
(数组)
func application(_ application: UIApplication, didReceiveRemoteNotification
userInfo: [AnyHashable : Any])
if let aps = userInfo["aps"] as? [String:Any] {
if let alert = aps["alert"] as? [String:Any] {
if let message = alert["message"] as? String {
//Do stuff
}
} else if let alert = aps["alert"] as? String {
//Do stuff
}
}
}
答案 1 :(得分:-1)
Swift 3不再自动将值类型(String
,即#34; aps")的类型与Objective-C引用类型(NSString
(需要的后代)联系起来输入字典的NSObject
键
所以你必须这样做:
userInfo["aps" as NSString]
你也可以省去一些麻烦,不得不重复这种桥接技术:尽快将其余部分变成原生的Swift形式:
if let aps = userInfo["aps" as NSString] as? [String: AnyObject] {
if let alert = aps["alert"] as? [String: String], message = alert["message"] {
// message is now a Swift String
}
else if let alert = aps["alert"] as? String {
// alert is now a Swift String
}
}