将结构的Swift数组强制转换为NSArray(反之亦然)以与NSUserDefaults一起使用的问题



我遇到了将结构的Swift数组桥接到NSArray的问题。我想在NSUserDefaults中存储一个结构的Swift数组。NSUserDefaults将只接受NSArray。有人能告诉我这是否是正确的做法吗:

首先,我声明了一个数组——SwiftStruct,并在我的程序中使用它:

var favorites = [SomeSwiftStruct]()

然后为了存储它,我必须把它变成一个NSArray。让编译器不抱怨的唯一方法是按如下方式升级:

let tempArray = favorites as Any as NSArray
let defaults = NSUserDefaults.standardUserDefaults()
defaults.setObject(tempArray, forKey: "favorites")

然后检索它,我想试试这个:

if let tempArray = defaults.objectForKey("favorites") as NSArray as Any as? [SomeSwiftStruct]{
  favorits = tempArray}

不幸的是,我还不能测试这是否有效。目前我只知道没有编译器抱怨

问题是,编译器抱怨的是你正在做一些不起作用的事情。不能在NSArray中存储非Objective-C对象(包括结构)。通过Any添加了足够多的模糊处理,编译器可以停止抱怨,但不能解决问题。

它编译的原因是,您的第二个as是强制转换,即Swift将执行它,无论它是否有效。但这是危险的,因为它在运行时不起作用,您只会得到一个断言。事实上,在目前测试版的Swift 1.2版本中,这种as已被重命名为as!,以表明它像这样很危险。

要在NSUserDefaults中存储内容,您必须在Swift结构上有一个方法,将其渲染为可以存储的内容(例如,一个字符串数组,它将可转换为NSStringNSArray)。

最新更新