Как создать 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"
];