Почему NSUserDefaults всегда возвращает ноль?

Я тестирую этот код на игровой площадке. Чего я не понимаю, так это почему результат всегда нулевой? Спасибо за помощь

var value: String!
let key = "key24"

if value == nil{
    value = "hehe"
    let valueNS = NSString(string: value)


    NSUserDefaults.standardUserDefaults().setValue(valueNS, forKey: key)
}



var result: AnyObject? = NSUserDefaults.standardUserDefaults().objectForKey(key)
print(result)

введите здесь описание изображения


person potato    schedule 13.09.2015    source источник
comment
Я только что проверил ваш код на игровой площадке, он работает нормально, и на выходе указано, что значение результата равно хе-хе, а не нулю.   -  person Adnan Munir    schedule 13.09.2015
comment
это серьезно странно. проверить скриншот   -  person potato    schedule 13.09.2015
comment
Не используйте setValue:forKey:. Используйте setObject:forKey:.   -  person rmaddy    schedule 13.09.2015
comment
теперь это действительно странно, потому что код работает на моей стороне   -  person Adnan Munir    schedule 13.09.2015
comment
установить объект для ключа не помогло. Я использую бета-версию xCode версии 7.0 (7A121l).   -  person potato    schedule 13.09.2015
comment
работает в реальном проекте. я согласен   -  person potato    schedule 13.09.2015
comment
Кстати, почему вы не используете Xcode 7 GM? Очень важно оставаться в курсе.   -  person rmaddy    schedule 14.09.2015
comment
версии xcode меняются быстрее, чем скачивание погоды :D   -  person potato    schedule 14.09.2015


Ответы (1)


С игровыми площадками происходит что-то странное, особенно с Xcode 7. Я могу заставить ваш код работать на Xcode 6.4 с несколькими изменениями:

Вы должны использовать setObject:forKey, а не setValue:forKey.

Вы должны выполнить синхронизацию после изменения значений по умолчанию.

Вот модифицированный код (который работает в Xcode 6.4, хотя его тестирование в Xcode также приводит к сбою Xcode 6.4).

//: Playground - noun: a place where people can play

import UIKit

var value: String!
let key = "key24"


if value == nil
{
  value = "hehe"
  print("value was nil!")
  NSUserDefaults.standardUserDefaults().setObject(value, forKey: key)
  NSUserDefaults.standardUserDefaults().synchronize()
}

var result = NSUserDefaults.standardUserDefaults().stringForKey(key)
print(result)
person Duncan C    schedule 13.09.2015
comment
Вызов synchronize() не нужен и не рекомендуется Apple. Никогда не нужно звонить при обычном использовании. Проверьте документы Foundation, чтобы узнать о нескольких случаях, когда это действительно необходимо. - person Jon Shier; 14.09.2015
comment
И все же, когда я тестировал его, вызов stringForKey возвращал nil без него и возвращал значение правильно, когда я его добавлял. - person Duncan C; 14.09.2015
comment
Я собираюсь пойти с наземной истиной того, что работает. - person Duncan C; 14.09.2015
comment
Вызов synchronize необходим только в том случае, если вы закрываете приложение или приложение аварийно завершает работу до того, как iOS синхронизирует NSUserDefaults для вас. - person rmaddy; 14.09.2015
comment
Я понимаю, что это то, что говорит Apple, но в этом случае добавление вызова для синхронизации заставляет второй вызов stringForKey возвращать правильное значение, а без него вы получаете nil. - person Duncan C; 14.09.2015
comment
Что не имеет смысла, так как NSUserDefaults работает иначе. Любая добавленная стоимость доступна немедленно. Возможно, это проблема детских площадок. В реальном приложении это не нужно. - person Jon Shier; 14.09.2015
comment
Наверное так. Не уверен, как игровые площадки взаимодействуют с песочницей приложения, пакетами и т. д. Видимо, не очень хорошо. - person Duncan C; 14.09.2015
comment
Я получал ноль каждый раз при извлечении из nsuserdefaults, и синхронизация сделала свое дело... спасибо - person user578386; 19.06.2016
comment
@ user578386, значит, это странное поведение на игровых площадках все еще существует в Xcode 7.3? Вздох... - person Duncan C; 19.06.2016