输入'任何'没有下标成员和类型的值'任何'没有会员'伯爵'

时间:2016-11-06 00:58:36

标签: casting swift3

在Xcode8上的Swift 3.0中创建一个字符串数组时,我收到以下两个错误:

  1. 类型的价值'任何'没有会员'计算'

    • 原始代码:return todoData.count
    • "固定" with:return(todoData as AnyObject).count
  2. 输入'任何'没有下标成员

    • 原始代码:if let text = todoData [indexPath.row] {
  3. 请参阅下面的完整代码:

    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
    }
    

2 个答案:

答案 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
}