[任何对象]?没有名为“下标”的成员

Posted

技术标签:

【中文标题】[任何对象]?没有名为“下标”的成员【英文标题】:[AnyObject]?' does not have a member named 'subscript' 【发布时间】:2014-09-22 13:34:58 【问题描述】:

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

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 数组声明为可选数组,因为它在第一次运行时可能为 nil。

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

我不知道如何解决这个问题。

【问题讨论】:

【参考方案1】:

数组声明为:

 private var items: [AnyObject]?

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

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

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

items?[indexPath.row]

但这还不是全部 - 您还必须使用有条件的向下转换:

as? Activity

因为前面的表达式可以计算为 nil

所以if语句的正确写法是

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

【讨论】:

感谢您的回复。我在if act.client != nil 行收到一个新错误Cannot invoke '!=' with an argument list of type '(@lvalue Client, NilLiteralConvertible)'。客户端属性是一个包含Client 对象的属性。请参阅ActivityNSManagedObject subclass。在客户端属性下的数据模型检查中,它被检查为可选。 client 不是可选的,因此它不能是 nil - 因此您无法检查它是否不为零。 if 在概念上是多余的,当然被认为是编译器的错误 所以根据this 问题,即使属性在Core Data 中标记为可选,在生成的NSManagedObject 类中也没有提及。您必须手动添加它。我在客户端属性前添加了一个?,现在它可以正常工作了。【参考方案2】:

首先,您需要打开或可选链接项目,因为它可以是nilAnyObject 在从数组中获取元素时具有不同的行为,因为 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 
        // ...
    

【讨论】:

感谢您的回复。但不幸的是,我仍然在同一行遇到同样的错误。 对不起,我有一个错字。立即尝试。 那个错误消失了。但是我在if act.client != nil 行收到一个新错误Cannot invoke '!=' with an argument list of type '(@lvalue Client, NilLiteralConvertible)' client 属性是否声明为可选值? 这是我的核心数据数据库中的另一个对象。 Here 是它的 NSManagedObject 子类。在属性下的数据模型检查器中,它被选中为可选。【参考方案3】:

我通过将索引变量类型从 UInt 转换为 Int 解决了我的问题

let obj = items[Int(index)]

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

【讨论】:

以上是关于[任何对象]?没有名为“下标”的成员的主要内容,如果未能解决你的问题,请参考以下文章

为firebase数据库创建用户对象时,类型“任何”没有下标成员[重复]

斯威夫特:'(字符串)-> AnyObject?没有名为“下标”的成员

(字符串:AnyObject)没有名为“下标”的成员

[NSObject:AnyObject]?在 Xcode 6 beta 6 中没有名为“下标”的成员错误

输入“任何?”没有下标成员[重复]

类型“任何”没有下标成员[重复]