【问题标题】:Problems with casting a Swift array of Structs to an NSArray and vice versa to use with NSUserDefaults将 Swift 结构数组转换为 NSArray 的问题,反之亦然以与 NSUserDefaults 一起使用
【发布时间】:2015-04-06 12:08:30
【问题描述】:

我遇到了将 Swift 结构体数组桥接到 NSArrays 的问题。我想在 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}

不幸的是,我还无法测试这是否有效。目前我只知道没有编译器投诉

【问题讨论】:

    标签: ios objective-c arrays swift


    【解决方案1】:

    问题是,编译器抱怨的是你正在做一些不起作用的事情。您不能将非 Objective-C 对象(包括结构)存储在 NSArray 中。通过Any 会增加足够的混淆,编译器会停止抱怨,但不能解决问题。

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

    要将内容存储在NSUserDefaults 中,您必须在您的 Swift 结构上拥有一个方法,将其呈现为可以存储的内容(例如,一个字符串数组,可以转换为 @987654327 @NSStrings)。

    【讨论】:

    • 谢谢,你当然是对的。如果有一种方便的方法可以通过类似于 NSKeyedArchiver 的方式转换 Swift 值类型会很好
    猜你喜欢
    • 2018-05-01
    • 2017-07-05
    • 2015-10-12
    • 2012-06-15
    • 2015-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多