使用objectForKey的Swift NSUserDefaults NSArray

dar*_*ryl 2 nsuserdefaults ios swift

我对Swift很陌生,而且我已经陷入了困境.

我正在尝试从数据中检索数据NSUserDefaults并将其存储在数组中(tasks):

@lazy var tasks: NSArray = {
    let def = NSUserDefaults.standardUserDefaults()
    let obj: AnyObject? = def.objectForKey("tasks")
    return obj as NSArray
}()
Run Code Online (Sandbox Code Playgroud)

我得到的只是一个警告:EXE_BAD_INSTRUCTION第3行.

还要注意我还没有实际设置任何数据,但我的目标是,如果没有数据,我希望数组为空.我将使用数据填充表格视图.

现在使用var而不是常量:

@lazy var tasks: NSArray = {
    let def = NSUserDefaults.standardUserDefaults()
    var obj: AnyObject? = {
        return def.objectForKey("tasks")
    }()
    return obj as NSArray
}()
Run Code Online (Sandbox Code Playgroud)

错误现在已移至返回行.

小智 6

我认为这里的问题是你试图转换nil为非可选类型并返回它.斯威夫特不允许这样做.解决这个问题的最佳方法如下:

@lazy tasks: NSArray = {
    let defaults = NSUserDefaults.standardUserDefaults()
    if let array = defaults.arrayForKey("tasks") as? NSArray {
        return array
    }
    return NSArray()
}
Run Code Online (Sandbox Code Playgroud)

使用Swift的if let语法与as?运算符相结合,您可以在一行中分配和安全转换.由于您的方法不返回可选项,因此如果转换失败,则必须返回有效值.

  • 这非常有效(我认为).我不得不将`arrayForKey`更改为`objectForKey`,因为我有一个错误:`'NSArray'不是'AnyObject []'的子类型. (2认同)