Как создать NSMutableDictionary в swift 2.0

Недавно я обновляю Xcode до 7 и содержит компилятор Swift 2.0. До этого я сделал свой проект со старой версией swift. В этой версии я создал NSMutableDictionary как ниже

    let dictParams:NSMutableDictionary? = ["test" : "test", 
        "username" : txtEmail.text, 
        "password" : txtPassword.text, 
        "version" : "1.0", 
        "appId" : "1", 
        "deviceId" : "fasdfasdfrqwe2345sdgdfe56gsdfgsdfg"
    ];

в приведенном выше коде txtEmail.text и txtPassword.text - это мое текстовое поле и заполнение значения во время выполнения.

Этот код корректно работает в старой версии swift, но после обновления до swift 2.0 он дает мне ошибку, например, ниже.

Cannot convert value of type '[String : String?]' to specified type 'NSMutableDictionary?'

что с ним не так, пожалуйста, помогите мне.

Ответ 1

Просто открыв интерфейсы класса NSMutableDictionary или NSDictionary из Xcode 7, вы можете легко увидеть, что базовый тип на самом деле [NSObject: AnyObject]. Это означает, что значение не может быть nil.

Развертывание текстовых значений, таких как txtEmail.text! или txtPassword.text!, может выглядеть нормально и помочь вам избавиться от компиляционной ошибки, но это плохой выбор, поскольку технически text свойство UITextField является необязательным, и ваше приложение может аварийно завершить работу в этом случае!

Сделайте это для вашей безопасности:

let dictParams: NSMutableDictionary? = ["test" : "test", 
    "username" : txtEmail.text ?? "", // Always use optional values carefully!
    "password" : txtPassword.text ?? "",
    "version" : "1.0", 
    "appId" : "1", 
    "deviceId" : "fasdfasdfrqwe2345sdgdfe56gsdfgsdfg"
]

Кстати, в случае, если не критично использовать NSMutableDictionary, рассмотрите использование словаря Swift следующим образом:

var mutableDictionary = [String: AnyObject] 

// OR this if the value can be nil
var mutableDictionary = [String: AnyObject?] 

Ответ 2

txtEmail.text и/или txtPassword.text возвращают необязательный параметр, поэтому он говорит вам об изменении типа. Вы можете переписать dict как быстрый словарь (это то, что я бы рекомендовал). Когда вы это сделаете, вы можете либо сделать объект необязательным, либо оставить его как просто String и выбить необязательную строку при создании dict.

var optionalString: String?

var someDict: [String: String?] = ["test": "test", "test1": optionalString]

Ответ 3

простое изменение в "username" : txtEmail.text! вместо "username" : txtEmail.text

поэтому окончательный код выглядит как ниже

let dictParams:NSMutableDictionary? = ["test" : "test", 
        "username" : txtEmail.text!,     //Add ! here 
        "password" : txtPassword.text!,  //Add ! here
        "version" : "1.0", 
        "appId" : "1", 
        "deviceId" : "fasdfasdfrqwe2345sdgdfe56gsdfgsdfg"
    ];