[英]Swift - Issue with data types
我在应用程序启动时将某些数据加载到NSUserDefaults中,当用户查看相应的View时,会将数据加载到TableView中。 我在使用数据类型时遇到了问题,无论尝试哪种方式,似乎总是会出现错误。
我要去哪里错了。 我跳过了一些代码,只给出了重要的部分。 我不断收到诸如“无法将Bool分配给AnyObject”之类的错误
// startup function which loads the data
var categorys : [[String:Bool]] = [["All": true]]
for (index: String, category: JSON) in output {
categorys.append([category["name"].string!: true])
}
NSUserDefaults.standardUserDefaults().setObject(categorys, forKey: "categorys")
// view controller
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
var categorys: [[String:Bool]] = []
func buildTableView() {
if let categorys = NSUserDefaults.standardUserDefaults().arrayForKey("categorys") {
for category in categorys {
self.categorys.append([category["name"] as! String: category["selected"] as! Bool])
}
// Was trying to just assign straight away but fails
// self.categorys = categorys
}
}
// then later on I want to be able to do the following
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
cell.textLabel?.text = self.categorys[indexPath.row]["name"] as? String
}
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
if (self.categorys[indexPath.row]["selected"] as? Bool == true) {
self.categorys[indexPath.row]["selected"] = "false"
}
}
}
我可能还应该提到我正在尝试使用其他数据类型,在此之前对于我的用法来说更合逻辑,但也存在类似的问题。
["name": [category["name"].string!, "selected": true]]
我还应该提到这是我的tableview的数据,如果单元格未选中,我想更新布尔值。
为了在NSUserDefaults
使用Bool
,必须使用setBool: forKey:
::
NSUserDefaults.standardUserDefaults().setBool(true, forKey: "key")
否则,这是有问题的,您必须执行解决方法,例如将Bool
存储在NSNumber
或String
。
您在评论中说,您遇到了有关“找到nil”的错误,但实际上与关于“无法将Bool分配给AnyObject”的错误并不完全相同。
对于您的nil
错误,您必须替换那些强制类型转换:
category["name"] as! String
具有可选的绑定:
if let name = category["name"] as? String {
}
现在,如果属性为nil,它将失败但不会崩溃,并将正确地附加到字典数组中:
let category = ["name":"me", "selected":true]
var categorys: [[String:Bool]] = []
if let name = category["name"] as? String, let selected = category["selected"] as? Bool {
categorys.append([name:selected])
} else {
// oops, a value was nil, handle the error
}
与其他操作相同,请勿使用强制转换:
if let myBool = self.categorys[indexPath.row]["selected"] where myBool == true {
self.categorys[indexPath.row]["selected"] = false
}
而且由于self.categorys[indexPath.row]["selected"]
是Bool类型,因此请不要分配字符串“ false”,而是实际的false
值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.