从NSUserDefaults展开NSMutableArray

时间:2015-03-10 23:29:38

标签: ios swift nsuserdefaults

我正在尝试从用户默认值中解包NSMutableArray,但不断收到错误unexpectedly found nil while unwrapping an Optional value。我在获取数组后尝试检查nil,但它发生在从UserDefaults获取数组的行上,所以我不知道如何修复此错误。有人可以帮忙吗?

var classURLs: NSMutableArray = NSMutableArray();
let defaults: NSUserDefaults = NSUserDefaults(suiteName: "group.myCompany.Array")!;
classURLs = NSMutableArray(object: defaults.objectForKey("Class URLs")!);

2 个答案:

答案 0 :(得分:1)

NSUserDefaults.objectForKey返回一个可选的原因 - 如果该键不存在,则返回nil。你不应该只用!

强行解开它

最常见的情况是,这是您第一次尝试阅读而没有写过它。

在这种情况下,您可能需要一个默认值,可能是一个空数组:

let classURLs = defaults.stringArrayForKey("Class URLs") as? [String] ?? []

(如果左侧的值为??,则nil替换右侧的值

注意,如果你编写Swift以使用Swift数组(例如[String])而不是NSMutableArray,那可能会更好,除非您要做的就是将其直接传递给调用到Objective-C。

您还可以通过使用可选链接来避免使用! init NSUserDefaults

let defaults = NSUserDefaults(suiteName: "group.myCompany.Array")
var classURLs = defaults?.stringArrayForKey("Class URLs") as? [String] ?? []

答案 1 :(得分:1)

如果密钥不存在,!对象的强制解包(nil)将导致崩溃。你需要考虑这种情况。

var classURLs = NSMutableArray(object:    
   NSUserDefaults.standardUserDefaults().objectForKey("foo") ?? [])

NB:从Objective-C过渡?你不需要分号! ; - )