我遇到了将结构的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结构上有一个方法,将其渲染为可以存储的内容(例如,一个字符串数组,它将可转换为NSString
的NSArray
)。