Продолжайте показывать ошибку на Swift 2.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

При понижении с 'String?!' До 'Sting' разворачиваются только дополнительные опции; вы хотели использовать

Но если я собираю и запускаю, он будет работать без проблем. Тем не менее, это довольно раздражает, что он продолжает появляться, когда я пишу код.

В любом случае, чтобы это исправить?

3 ответа

Решение

Я наконец выясняю, как избавиться от этих ошибок. В 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 {  
        ..... 
    }
} 

Тогда ошибки, отображаемые в строках, исчезнут.

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

    // do something with message
}

Попробуйте очистить папку сборки и производные данные. Если это не сработает, распаковка ваших переменных или использование необязательной цепочки должно подавить предупреждение

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

или же

guard let message = info["aps"]?["alert"] as? String else {
    return
}
// ...
Другие вопросы по тегам