0

在我升级到 Xcode 7.3 后,Swift 2.2。

在代码中,

func handleInfo(info: [NSObject: AnyObject]) {  
    let aps = info["aps"]  
    if let message = aps!["alert"] as? String {  
      .....  
    }  
} 

它将继续显示此行的错误:

if let message = aps!["alert"] as? String

(从 'String?!' 向下转换到 'Sting' 只会解开可选项;你的意思是使用 '!!' 吗?)

但是如果我构建并运行,它将成功运行而没有任何问题。但是,当我编码时它不断出现,这很烦人。

无论如何要解决这个问题?

4

3 回答 3

1
func handleInfo(info: [NSObject: AnyObject]) {
    guard let aps = info["aps"] as? [String: AnyObject],
        message = aps["alert"] as? String else {
            return
    }

    // do something with message
}
于 2016-03-23T19:57:52.153 回答
1

我终于弄清楚如何摆脱这些错误。在 Swift 2.2 中,它对数据类型应用了更严格的规则。

所以如果 Dictionary 中有一个 key 的值也是一个 Dictionary,我们需要指定它的数据类型。

所以最初,我们有代码:

func handleInfo(info: [NSObject: AnyObject]) {  
    let aps = info["aps"]  
    if let message = aps!["alert"] as? String {  
        ..... 
    }
}  

现在在 Swift 2.2 中它将是:

func handleInfo(info: [NSObject: AnyObject]) {  
    let aps = info["aps"] as! [String: AnyObject]
    if let message = aps!["alert"] as? String {  
        ..... 
    }
} 

然后显示在行中的错误将消失。

于 2016-05-09T18:52:42.110 回答
0

尝试清理您的构建文件夹和派生数据。如果这不起作用,解开变量或使用可选链接应该抑制警告

if let aps = info["aps"] {
    if let message = aps["alert"] as? String {
        // ...
    }
}

或者

guard let message = info["aps"]?["alert"] as? String else {
    return
}
// ...
于 2016-03-23T19:35:35.873 回答