我对Swift很陌生,而且我已经陷入困境。
我正在尝试从NSUserDefaults
检索数据并将其存储在数组(tasks
)中:
@lazy var tasks: NSArray = {
let def = NSUserDefaults.standardUserDefaults()
let obj: AnyObject? = def.objectForKey("tasks")
return obj as NSArray
}()
我得到的只是警告:第3行EXE_BAD_INSTRUCTION
。
另外要注意我还没有实际设置任何数据,但我的目标是,如果没有数据,我希望数组为空。我将使用数据填充表格视图。
现在使用var而不是常量:
@lazy var tasks: NSArray = {
let def = NSUserDefaults.standardUserDefaults()
var obj: AnyObject? = {
return def.objectForKey("tasks")
}()
return obj as NSArray
}()
现在错误已移至返回行。
答案 0 :(得分:6)
我认为这里的问题是你试图将nil
转换为非可选类型并返回它。斯威夫特不允许这样做。解决这个问题的最佳方法如下:
@lazy tasks: NSArray = {
let defaults = NSUserDefaults.standardUserDefaults()
if let array = defaults.arrayForKey("tasks") as? NSArray {
return array
}
return NSArray()
}
使用Swift的if let
语法与as?
运算符相结合,您可以在一行中分配和安全转换。由于您的方法不返回可选项,因此如果转换失败,则必须返回有效值。