Как я могу преобразовать NSDictionary в словарь?

Я уже обновился до XCode 8 и теперь мне нужно конвертировать код из Swift 2 в Swift 3.

До того, когда я хочу конвертировать NSDictionary в DictionaryЯ просто написал следующее:

let post_paramsValue = post_params as? Dictionary<String,AnyObject?>

где post_params является NSDictionary,

Но теперь с Swift 3 я получаю эту ошибку:

NSDictionary is not convertible to Dictionary

Зачем? Что изменилось?


Редактировать 1

Я также попробовал следующее:

let post_paramsValue = post_params as Dictionary<String,Any>

Но это дает эту ошибку:

'NSDictionary! не конвертируется в "; Вы имели в виду использовать let post_paramsValue = post_params as Dictionary<String,Any>

Где я заявляю NSDictionary вместо NSDictionary!, но это не работает; Я получил эту ошибку:

NSDictionary не может быть преобразован в "; Вы имели в виду использовать let post_paramsValue = post_params as Dictionary<String,Any>!

Но я получил эту ошибку:

'NSDictionary! не конвертируется в !"; Вы имели в виду использовать как! для принудительного подавления?" src="/images/b474723252d8f6e28776c30bad33ead95581ba26.png"/>

2 ответа

Решение
  • NSDictionary в Objective-C всегда есть необязательные значения.
  • AnyObject стал Any в Свифте 3.
  • Учитывая первые два "правила" NSDictionary можно навести мост к Dictionary

let post_paramsValue = post_params as Dictionary<String,Any>

Если источник NSDictionary это необязательный, вы можете использовать as Dictionary<String,Any>? или же as? Dictionary<String,Any> или же as! Dictionary<String,Any> или же as Dictionary<String,Any>! в зависимости от фактического типа NSDictionary

Для тех, у кого проблемы с NSDictionary, просто используйте это расширение:

Swift 3.0

extension NSDictionary {
    var swiftDictionary: Dictionary<String, Any> {
        var swiftDictionary = Dictionary<String, Any>()

        for key : Any in self.allKeys {
            let stringKey = key as! String
            if let keyValue = self.value(forKey: stringKey){
                swiftDictionary[stringKey] = keyValue
            }
        }

        return swiftDictionary
    }
}

Вам просто нужно правильно объявить NSDictionary в objc

Например: NSDictionary<NSString *, NSString*> автоматически переводится на [String: String] в быстрых интерфейсах

Другие вопросы по тегам