继续在Swift 2.2上显示错误,但可以成功构建

时间:2016-03-23 19:30:38

标签: swift swift2.2

升级到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

(Downcast from 'String?!' to 'Sting' only unwraps optionals; did you meant to use '!!'?)

但是如果我构建并运行,它将成功运行而没有任何问题。 然而,当我编码时它会不断出现,这非常令人讨厌。

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

3 个答案:

答案 0 :(得分: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
}

答案 1 :(得分:1)

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

因此,如果Dictionary中的键值也是一个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 {  
        ..... 
    }
} 

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

答案 2 :(得分:0)

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

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

guard let message = info["aps"]?["alert"] as? String else {
    return
}
// ...
相关问题