【问题标题】:NSUserDefaults in iOS PlaygroundiOS Playground 中的 NSUserDefaults
【发布时间】:2015-09-21 11:51:40
【问题描述】:

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 中,最后一行正确返回“这是一个测试”。

import Cocoa

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

知道这是为什么吗?错误?

【问题讨论】:

  • 你运行的是什么版本的 Xcode,这对我来说适用于 Xcode 6.4。
  • 两个 sn-ps 在 6.4 上对我来说也可以正常工作

标签: ios swift xcode nsuserdefaults swift-playground


【解决方案1】:

如果我使用 import UIKit(导入 Cocoa 库的代码)不起作用;

import Cocoa

let defaults = UserDefaults.standard

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

【讨论】:

    【解决方案2】:

    在 Xcode 9.2 for iOS 中,当前甚至可以在 Playground 的重新运行之间保存 UserDefaults。起初这让我很恼火,因为我希望在每次停止后都会清理 UserDefaults,就像它们显然以前一样。 所以,一个警告:UserDefaults 现在在重新运行之间保持不变,最好在搜索错误时记住这一点,可能会有副作用!

    【讨论】:

      【解决方案3】:

      不管怎样,以下代码在 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
      

      【讨论】:

      • 我昨天试过了,它确实可以 100% 工作,没有任何问题。我今天运行完全相同的代码,但它不起作用。该值未设置,因此它返回 nil。有什么想法吗?
      【解决方案4】:

      代码在 Xcode 6.4 中正常工作,但在 Xcode 7.0 beta (7A120f) 中失败。

      1. 已知测试版存在错误。
      2. 提交错误报告:http://bugreport.apple.com

      【讨论】:

      • 看起来这在 Xcode 7 GM 种子中也失败了。
      • Xcode 7.1.1 相同,但是 NSKeyedArchiver 工作正常
      【解决方案5】:

      这并不是一个真正的错误..... NSUserDefaults 与 iOS 沙箱环境相关联。 Playgrounds 不在此环境中运行。因此,您将无法将文件写入磁盘。如果您在通过模拟器或设备运行时在应用程序中运行此代码,您将可以访问沙盒环境,并且 NSUserDefaults 将返回正确的引用。我确实看到我在操场上得到了适当的参考,并且可以设置和获取值,所以这里肯定有其他事情发生。由于性质,我只是不会依赖这种方式来测试这种类型的功能。

      注意当我同步商店时会发生什么。

      由于没有什么可以坚持的事实,该值变为 nil。

      【讨论】:

      • 这适用于我在 iOS 游乐场:let readString = defaults.objectForKey("name") as? String
      • 我已经更新了我的答案以反映我在 Xcode 6 中看到的内容。出于好奇,您使用的是 Xcode 7 测试版吗?我真的不会依赖读/写/存储功能在游乐场环境中正常工作。 Playground 环境适用于更独立的模块化代码而不是持久性代码。
      猜你喜欢
      • 2014-11-18
      • 1970-01-01
      • 2018-08-24
      • 1970-01-01
      • 2011-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-09
      相关资源
      最近更新 更多