[AnyObject]&#39?;没有名为'下标'的成员

时间:2014-09-22 13:34:58

标签: ios arrays swift optional

我正在将核心数据数据库中的对象列表加载到表视图中。

class ScheduleViewController: UITableViewController {

    private var items: [AnyObject]?

    // MARK: - Table view data source
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        if let itemCount = items?.count {
            return itemCount
        }
    }

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("DayScheduleCell", forIndexPath: indexPath) as DayScheduleCell

        if let act = items[indexPath.row] as Activity {
            if act.client != nil {
                // ...
            }
        }

        return cell
    }
}

在闭包内部检索数据,因此我已将items数组声明为可选项,因为它在第一次运行时可能为零。

我收到错误'[AnyObject]?'该行if let act = items[indexPath.row] as? Activity没有名为“下标”的成员

我无法弄清楚如何解决这个问题。

3 个答案:

答案 0 :(得分:21)

数组声明为:

 private var items: [AnyObject]?

所以,正如你所说,它是一个可选的

在swift中,optional是一个枚举,因此它本身就是一个类型 - 作为一个可选类型,它可以包含nil值或包含类型的对象。

您想要将下标应用于数组,而不是应用于可选项,因此在使用它之前,您必须从可选的

中解包该数组。
items?[indexPath.row]

但并非全部 - 你还必须使用条件下转:

as? Activity

因为前面的表达式可以评估为nil

所以编写if语句的正确方法是

if let act = items?[indexPath.row] as? Activity {

答案 1 :(得分:2)

首先,您需要打开或选择链接项目nil。由于AnyObject可以是一个函数,AnyObject从数组中获取元素时有不同的行为。您必须使用以下项目进行投射:

if let act = items?[indexPath.row] as AnyObject? as Activity? {
    if act.client != nil {
        // ...
    }
}

如果items永远不会包含某个功能,您可以使用

private var items: [Any]?

代替并施放:

if let act = items?[indexPath.row] as? Activity {
    if act.client != nil {
        // ...
    }
}

答案 2 :(得分:1)

我已经通过将索引var类型从UInt转换为Int

来修复我的问题
let obj = items[Int(index)]

希望这可以帮助那些仍然遇到此问题的人。