Я проверяю, равен ли объект в nsdictionary нулю, и я получаю неправильный ответ — почему?

#ios #swift #nsdictionary

#iOS #swift #nsdictionary

Вопрос:

Я хочу сохранить NSUserDefaults информацию, нажал ли пользователь кнопку или нет. У меня есть две кнопки, одна имеет значение 1, другая -1.

Когда пользователь нажимает одну из этих двух кнопок, я делаю это:

 if (self.defaults.objectForKey("pressedButtons") == nil){
    let currentButtonId:[String:String] = [self.pressedButtons:vote]
    self.defaults.setObject(currentButtonId, forKey: "pressedButtons")
    self.defaults.synchronize()
} else {
    var pressedButtons:[String:String] = self.defaults.objectForKey("pressedButtons") as! [String:String]
    pressedButtons[self.button_id] = vote
    self.defaults.setObject(pressedButtons, forKey: "pressedButtons")
    self.defaults.synchronize() 
}
 

в приведенном выше коде vote есть строковое значение, которое может быть либо "1" или "-1" .

Теперь, когда пользователь возвращается к панели, я проверяю, нажал ли он уже кнопку или нет. Вот как я это проверяю:

 if (self.defaults.objectForKey("pressedButtons") != nil){

    if (self.defaults.objectForKey("pressedButtons")![currentButtonId] != nil) {
        print("user already pressed")
        print(self.defaults.objectForKey("pressedButtons")![currentButtonId])
    } else {
        print("USER didn't press the button yet")
    }
} else {
    print("USER didn't press the button yet for sure") 
}
 

вывод, который я всегда вижу, это:

 user already pressed
nil
 

Поскольку эта строка:

 print(self.defaults.objectForKey("pressedButtons")![currentButtonId])
 

печатает nil , почему я вижу сообщение о том, что пользователь нажал кнопку?

Комментарии:

1. Вы пробовали посмотреть, какие self.defaults.objectForKey("pressedButtons") отпечатки?

2. Да, я это сделал, пока у меня там только одна запись: Optional({ 583201282b9b12326fe2fee5 = 1;}) , но ситуация происходит независимо от того, какой идентификатор я ввел self.defaults.objectForKey("pressedButtons")![currentButtonId]

3. @user3766930 Можете ли вы попробовать то, что я только что опубликовал в качестве ответа

4. Вы контролируете значение 583201282b9b12326fe2fee5 ? Что self.pressedButtons именно вы храните в виде строки [self.pressedButtons:vote] ?

5. Ребята, ответ @RajanMaheshwari сработал, я присвоил его переменной, и теперь он работает как шарм!

Ответ №1:

Возьмите этот объект, который всегда отображается как [String:String] при извлечении

 let variable = self.defaults.objectForKey("pressedButtons") as! [String:String]
 

Теперь это переменная типа [String:String]

Теперь извлеките свое значение соответствующим образом

Это не означает, что self.defaults.objectForKey("pressedButtons") это объект с типом [String:String] . Итак, сначала введите его, а затем используйте. Так self.defaults.objectForKey("pressedButtons")![currentButtonId] что, похоже, это ноль

Комментарии:

1. Спасибо @Rajan, ты был прав, сохранив его как переменную, теперь он работает!