2014-09-22 159 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)] 

希望這可以幫助仍然有這個問題的人。

相關問題