NSUserDefaults in iOS Playground

i0S Swift Issue

Question or problem in the Swift programming language:

There seems to be a strange issue with iOS Playgrounds where NSUserDefaults always returnsnil instead of the actual value.

In an iOS Playground the last line wrongly returns nil.

import UIKit

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

In an OSX Playground the last line correctly returns “This is a test”.

import Cocoa

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

Any idea why this is? Bug?

How to solve the problem:

Solution 1:

That’s not really a bug….. NSUserDefaults is tied to the iOS sandbox environment. Playgrounds doesn’t run in this environment. Hence why you won’t be able to write files to disk. If you run this code in the application when running via the simulator or device, you’ll have access to the sandbox environment and NSUserDefaults will return a proper reference. I do see though that I get a proper reference in playgrounds and can set and get values, so there has to be something else going on here. I just wouldn’t rely on this being the way to test this type of functionality due to the nature.

Notice what happens when I synchronize the store.

Example

The value becomes nil due to the fact that there’s nothing to persist against.

Solution 2:

For what it’s worth, the following code works fine in iOS Playground version 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!)

prints:

This is a test

Solution 3:

The code works correctly in Xcode 6.4 but fails in Xcode 7.0 beta (7A120f).

  1. Betas are known to have bugs.
  2. File a bug report: http://bugreport.apple.com

Solution 4:

In Xcode 9.2 for iOS it’s currently even working that the UserDefaults are saved between reruns of the playground. That was at first irritating me, because I expected that after each stop the UserDefaults would be cleaned, like they were obviously before.
So, a warning: UserDefaults are now persisted between reruns, better keep that in mind when searching for bugs, there may be side effects!

Hope this helps!