web-dev-qa-db-fra.com

Comment convertir NSDictionary en dictionnaire?

J'ai déjà mis à jour XCode 8 et je dois maintenant convertir mon code de Swift 2 à Swift 3.

Avant, lorsque je voulais convertir NSDictionary en Dictionary, je viens d'écrire ce qui suit:

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

post_params est NSDictionary.

Mais maintenant, avec Swift 3, je reçois cette erreur:

NSDictionary is not convertible to Dictionary

Pourquoi? Qu'est-ce qui a changé?


Modifier 1

J'ai aussi essayé ce qui suit:

let post_paramsValue = post_params as Dictionary<String,Any>

Mais cela donne cette erreur:

 'NSDictionary!' is not convertible to 'Dictionary<String, Any>'; did you mean to use <code>as!</code> to force downcast?


Modifier 2

J'ai aussi essayé ce qui suit:

let post_paramsValue =  post_params as Dictionary<String,Any>

Où je déclare NSDictionary au lieu de NSDictionary!, mais cela ne fonctionne pas; J'ai eu cette erreur:

 'NSDictionary' is not convertible to 'Dictionary<String, Any>'; did you mean to use <code>as!</code> to force downcast?


Modifier 3

J'ai aussi essayé ce qui suit:

let post_paramsValue =  post_params as Dictionary<String,Any>!

Mais j'ai reçu cette erreur:

 'NSDictionary!' is not convertible to 'Dictionary<String, Any>!'; did you mean to use <code>as!</code> to force downcast?

7
david
  • NSDictionary en Objective-C a toujours des valeurs non optionnelles.
  • AnyObject est devenu Any dans Swift 3.
  • Considérant que les deux premières "règles" NSDictionary peuvent être transformées en pont en Dictionary

let post_paramsValue = post_params as Dictionary<String,Any>

Si la source NSDictionary est facultative, vous pouvez utiliser as Dictionary<String,Any>? ou as? Dictionary<String,Any> ou as! Dictionary<String,Any> ou as Dictionary<String,Any>! en fonction du type réel de NSDictionary.

13
vadian

Pour ceux qui ont un problème avec NSDictionary, utilisez simplement cette extension:

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
    }
}
1
Dzeremix