2015-07-03 2 views
8

Кажется, странная проблема с игровыми площадками iOS, где NSUserDefaults всегда возвращает nil вместо фактического значения.NSUserDefaults in iOS Playground

На игровой площадке iOS последняя строка ошибочно возвращает nil.

import UIKit 

let defaults = NSUserDefaults.standardUserDefaults() 
defaults.setObject("This is a test", forKey: "name") 
let readString = defaults.objectForKey("name") 

На игровой площадке OSX последняя строка правильно возвращает «Это тест».

import Cocoa 

let defaults = NSUserDefaults.standardUserDefaults() 
defaults.setObject("This is a test", forKey: "name") 
let readString = defaults.objectForKey("name") 

Любая идея, почему это так? Ошибка?

+0

Какую версию Xcode вы используете, это работает для меня с Xcode 6.4. – zaph

+0

Оба фрагмента также отлично работают для меня на 6.4 – SomeGuy

ответ

7

На самом деле это не ошибка ..... NSUserDefaults привязан к среде песочницы iOS. Игровые площадки не работают в этой среде. Следовательно, вы не сможете записывать файлы на диск. Если вы запустите этот код в приложении при работе с симулятором или устройством, у вас будет доступ к среде песочницы, а NSUserDefaults вернет правильную ссылку. Я вижу, что я получаю правильную ссылку на игровых площадках и могу устанавливать и получать значения, поэтому здесь должно быть что-то еще. Я просто не стал бы полагаться на то, что это способ проверить этот тип функциональности из-за природы.

Обратите внимание, что происходит, когда я синхронизирую магазин.

Example

значение становится нулевым из-за того, что нет ничего упорствовать против.

+1

Это работает для меня на игровой площадке iOS: 'let readString = defaults.objectForKey (« name ») как? String'. – zaph

+0

Я обновил свой ответ, чтобы отразить то, что я увидел в Xcode 6. Просто из любопытства вы используете бета-версию Xcode 7? Я действительно не буду полагаться на функции чтения/записи/хранения для правильной работы в игровой среде. Условия игровой площадки предназначены для более независимого модульного кода, а не постоянного кода. – TheCodingArt

1

Код работает правильно в Xcode 6.4, но не работает в Xcode 7.0 beta (7A120f).

  1. Бета-версии, как известно, имеют ошибки.
  2. Файл отчета об ошибке: http://bugreport.apple.com
+2

Похоже, что это не так и в семенах Xcode 7 GM. –

+0

для Xcode 7.1.1 Однако NSKeyedArchiver работает правильно –

2

Для чего это стоит, следующий код отлично работает в IOS Playground версии 1.6.1 (Swift 4):

import Foundation 

let defaults = UserDefaults.standard 
defaults.set("This is a test", forKey: "name") 
let readString = defaults.string(forKey: "name") 
print(readString!) 

печатает:

This is a test 
0

В Xcode 9.2 для iOS в настоящее время он работает даже с тем, что UserDefaults сохраняются между повторами pl ayground. Это меня сначала раздражало, потому что я ожидал, что после каждой остановки UserDefaults будут очищены, как и раньше. Итак, предупреждение: UserDefaults теперь сохраняются между повторами, лучше помните об этом при поиске ошибок, могут быть побочные эффекты!