Récemment, j'ai mis à jour Xcode vers 7 et il contient le compilateur Swift 2.0. Avant cela, j'ai réalisé mon projet avec l'ancienne version de Swift. Dans cette version j'avais créer NSMutableDictionary
comme ci-dessous
let dictParams:NSMutableDictionary? = ["test" : "test",
"username" : txtEmail.text,
"password" : txtPassword.text,
"version" : "1.0",
"appId" : "1",
"deviceId" : "fasdfasdfrqwe2345sdgdfe56gsdfgsdfg"
];
ci-dessus, le code txtEmail.text
et txtPassword.text
est mon champ de texte et remplit la valeur au moment de l'exécution.
Ce code fonctionne correctement dans les anciennes versions de Swift mais après la mise à jour vers Swift 2.0, il me donne une erreur semblable à celle ci-dessous.
Cannot convert value of type '[String : String?]' to specified type 'NSMutableDictionary?'
quel est le problème avec elle s'il vous plaît guide-moi.
En ouvrant simplement les interfaces de classe NSMutableDictionary
ou NSDictionary
à partir de Xcode 7, vous pourrez facilement voir que le type sous-jacent est en réalité [NSObject: AnyObject]
. Cela signifie que la valeur ne peut pas être nil
.
Décompresser des valeurs textuelles telles que txtEmail.text!
ou txtPassword.text!
peut sembler correct et vous aider à supprimer l’erreur de compilation, mais c’est un mauvais choix car techniquement la propriété text
de UITextField
est facultative et votre application peut se bloquer dans ce cas!
Faites ceci pour votre sécurité:
let dictParams: NSMutableDictionary? = ["test" : "test",
"username" : txtEmail.text ?? "", // Always use optional values carefully!
"password" : txtPassword.text ?? "",
"version" : "1.0",
"appId" : "1",
"deviceId" : "fasdfasdfrqwe2345sdgdfe56gsdfgsdfg"
]
À propos, s'il n'est pas essentiel d'utiliser NSMutableDictionary
, veuillez utiliser le dictionnaire Swift comme ceci:
var mutableDictionary = [String: AnyObject]
// OR this if the value can be nil
var mutableDictionary = [String: AnyObject?]
changement simple dans "username" : txtEmail.text!
à la place "username" : txtEmail.text
donc le code final est comme ci-dessous
let dictParams:NSMutableDictionary? = ["test" : "test",
"username" : txtEmail.text!, //Add ! here
"password" : txtPassword.text!, //Add ! here
"version" : "1.0",
"appId" : "1",
"deviceId" : "fasdfasdfrqwe2345sdgdfe56gsdfgsdfg"
];
txtEmail.text
et/ou txtPassword.text
renvoient une option, raison pour laquelle il vous demande de changer le type. Vous pouvez réécrire le dict sous forme de dictionnaire Swift (ce que je recommanderais). Lorsque vous le faites, vous pouvez rendre l’objet facultatif ou le laisser simplement String
et détacher la chaîne facultative lorsque vous créez le dict.
var optionalString: String?
var someDict: [String: String?] = ["test": "test", "test1": optionalString]