在Xcode8上的Swift 3.0中创建一个字符串数组时,我收到以下两个错误:
类型的价值'任何'没有会员'计算'
输入'任何'没有下标成员
请参阅下面的完整代码:
let todoData = UserDefaults.standard.value(forKey: "todosArray")
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if let todoData = todoData {
return todoData.count //Error 1.
} else {
return 0
}
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier", for: indexPath) as! TableViewCell
if let todoData = todoData {
if let text = todoData[indexPath.row] { //Error 2.
cell.label.text = text as? String
}
}
return cell
}
答案 0 :(得分:0)
在这里:
let todoData = UserDefaults.standard.value(forKey: "todosArray")
编译器已将todoData
的类型推断为Any?
,因为该行调用UserDefaults
方法覆盖NSObject
方法value(forKey:)
,该方法返回{ {1}}。您可以通过选项单击变量来自行查看。类型Any?
没有属性Any?
,或者带有count
的下标。
天真的解决方案就是施展它:
Int
但更好的选择是通过调用array(forKey:)
替换let todoData = UserDefaults.standard.value(forKey: "todosArray") as? [ToDo]
,这将为您执行演员投放:
value(forKey:)
此代码:
let todoData = UserDefaults.standard.array(forKey: "todosArray")
可以更简单地表达为:
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if let todoData = todoData {
return todoData.count //Error 1.
} else {
return 0
}
}
这使用空合并运算符(override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return todoData.count ?? 0
}
)。您可以在here找到更多相关信息。
这段代码:
??
可以改写为:
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier", for: indexPath) as! TableViewCell
if let todoData = todoData {
if let text = todoData[indexPath.row] { //Error 2.
cell.label.text = text as? String
}
}
return cell
}
这使用带有可选链接的下标。您可以阅读更多相关信息here。
答案 1 :(得分:0)
修改您对此的回答
let todoData = UserDefaults.standard.value(forKey: "todosArray")
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if let todoData = todoData as? [String] {
return todoData.count
} else {
return 0
}
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier", for: indexPath) as! TableViewCell
if let todoData = todoData as? [String] {
if let text = todoData[indexPath.row] {
cell.label.text = text
}
}
return cell
}