iOS Playground中的NSUserDefaults

10

iOS Playgrounds似乎存在一个奇怪的问题,即NSUserDefaults始终返回nil,而不是实际值。

在iOS Playground中,最后一行错误地返回了nil

import UIKit

let defaults = NSUserDefaults.standardUserDefaults()
defaults.setObject("This is a test", forKey: "name")
let readString = defaults.objectForKey("name")
在OSX Playground中,最后一行正确地返回"This is a test"。
import Cocoa

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

这是为什么呢? 是Bug吗?


你正在使用哪个版本的 Xcode?这适用于我使用的 Xcode 6.4。 - zaph
这两个代码片段在6.4上对我来说也都很好用。 - SomeGuy
5个回答

7
这并不是一个真正的错误......NSUserDefaults与iOS沙盒环境相关联。Playgrounds不运行在这个环境中。因此,您将无法将文件写入磁盘。如果您在模拟器或设备上运行应用程序时运行此代码,则可以访问沙盒环境,并且NSUserDefaults将返回正确的引用。但我注意到在playgrounds中我可以获得正确的引用并设置和获取值,因此这里肯定还有其他问题。只是由于性质,我不会依赖这种方式来测试这种类型的功能。

注意当我同步存储时会发生什么。

Example

该值变为nil,因为没有任何内容需要持久化。


1
这在我的iOS playground中有效:let readString = defaults.objectForKey("name") as? String - zaph
我已经更新了我的答案,以反映我在Xcode 6中看到的内容。只是出于好奇,你是否正在使用Xcode 7 beta?我真的不会依赖playground环境中的读/写/存储功能正常工作。Playground环境适用于更独立的模块化代码,而不是持久性代码。 - TheCodingArt

3

就代码而言,以下代码可以在中很好地运行:

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

我昨天尝试过这个,完全没有问题。但今天我运行了完全相同的代码,却无法正常工作。该值未设置,因此返回nil。有什么想法吗? - Junaid

1
该代码在Xcode 6.4中正常运行,但在Xcode 7.0 beta (7A120f)中失败。
- Beta版本已知存在错误。 - 提交错误报告:http://bugreport.apple.com

2
看起来在 Xcode 7 GM 版本中也失败了。 - Duncan C
然而,对于Xcode 7.1.1同样适用。但是NSKeyedArchiver无法正常工作。 - Ronny Webers

0

如果我使用import UIKit,代码将无法工作,但导入Cocoa库的代码可以正常工作;

import Cocoa

let defaults = UserDefaults.standard

defaults.set("This is a test", forKey: "name")
let readString = defaults.object(forKey: "name")

0
在iOS的Xcode 9.2中,甚至是在playground重新运行时也可以保存UserDefaults。起初这让我感到困惑,因为我希望在每次停止后UserDefaults都会被清除,就像以前一样明显地被清除了。 所以,警告:UserDefaults现在在重复运行之间持久存在,当查找错误时最好记住这一点,可能会有副作用!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接