2014-09-22 68 views
7

我正在将核心数据数据库中的对象列表加载到表视图中。[AnyObject]?'没有名为'subscript'的成员

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]?'没有名为'subscript'的成员在此行if let act = items[indexPath.row] as? Activity

我想不出如何解决这个问题。

回答

21

的数组被声明为:

private var items: [AnyObject]? 

所以,你也说了,这是一个可选的

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

你想标应用到阵列,而不是可选的,因此在使用它之前,你必须从可选

items?[indexPath.row] 

解开的数组,但还不是全部 - 你也必须使用有条件垂头丧气:

as? Activity 

,因为以前的表达可以评估到零

所以写正确的方式,如果语句是

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

感谢您的回复。我得到一个新的错误**不能在'if act.client!= nil'这一行用'(@lvalue Client,NilLiteralConvertible)'**'类型的参数列表调用'!='。客户端属性是一个拥有“客户端”对象的属性。请参阅Activity的'NSManagedObject' [subclass](http://pastie.org/9584414#)。在数据模型中,在客户端的属性下进行检查,但检查为可选。 – Isuru 2014-09-22 14:32:40

+0

'client'不是可选的,因此它不能是'nil' - 因此你不能检查它是否为零。if'在概念上是多余的,当然被认为是编译器的错误 – Antonio 2014-09-22 14:46:15

+0

所以根据[this](http://stackoverflow.com/q/25485273/1077789)的问题,即使Core Data中的属性被标记为可选,它在生成的NSManagedObject类中没有提及。你必须手动添加它。我在客户端属性前添加了一个'?',现在它工作正常。 – Isuru 2014-09-22 14:47:26

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 { 
     // ... 
    } 
} 
+0

感谢您的回复。但不幸的是,我仍然在同一条线上得到同样的错误。 – Isuru 2014-09-22 14:20:09

+0

对不起,我有一个错字。现在试试。 – Kirsteins 2014-09-22 14:21:12

+0

错误消失了。但是我得到一个新的错误**不能用''(@lvalue Client,NilLiteralConvertible)'**'在行'if act.client!= nil'的参数列表调用'!=' – Isuru 2014-09-22 14:22:23

1

我有固定的我将指数var type从UInt转换为Int的问题

let obj = items[Int(index)] 

希望这可以帮助仍然有这个问题的人。

相关问题