web-dev-qa-db-fra.com

Comment créer NSMutableDictionary dans Swift 2.0

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.

11
iOS.Wolf5219866

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?] 
18
Ducky

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"
    ];
0
Bhavin_m

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]
0
Peter Foti