2016-10-27 37 views
0

我正在編寫一個寫在swift 3.0中的項目。我的要求是保存在某些文本字段中輸入的數據,並將其中一個屬性填充到表視圖中,一旦選中一行,我想更新該記錄(在我的文本字段上重新賦值)。無法將類型'NSTaggedPointerString'的值轉換爲數組

但是,當我嘗試獲取已保存在core data中的數據並將它們分配到數組中時,我的代碼出現問題。基本上我有一個名爲「任務」的實體,它有三個屬性,因爲我想填充這些屬性(稱爲「名稱」),我已經保存在覈心數據中的一個表格視圖,我寫了代碼如下。但即時通訊在我的代碼中的以下行中發現異常,說「Could not cast value of type NSTaggedPointerString (0x10d8f7b90) to NSArray (0x10d8f7c58)」。

錯誤行和代碼如下。

tasks += expName as! [Task] 

這裏是我的全碼:

import UIKit 
import CoreData 

class TableViewController: UIViewController,UITableViewDelegate,UITableViewDataSource { 

@IBOutlet weak var tableView: UITableView! 

let appDelegate : AppDelegate = UIApplication.shared.delegate as! AppDelegate 
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext 

var tasks = [Task]() 

override func viewDidLoad() { 
    super.viewDidLoad() 

    // Do any additional setup after loading the view. 
} 

override func viewDidAppear(_ animated: Bool) { 

    //var error : NSError? 
    let request = NSFetchRequest <NSFetchRequestResult> (entityName: "Task") 
    request.returnsObjectsAsFaults = false 
    do { 

     let results = try context.fetch(request) 
     // check data existance 
     if results.count>0 { 
      print(results.count) 

      for resultGot in results as! [NSManagedObject]{ 

       if let expName = resultGot.value(forKey:"name"){ 
        print("expence name is :", expName) 
        tasks += expName as! [Task]  
        print("my array is : \(tasks)") 
       } 
      }  
     }  
    }catch{ 
     print("No Data to load") 
    } 
    self.tableView.reloadData() 
} 
override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) 
    cell.textLabel?.text = tasks [indexPath.row] as? String 
    return cell 
} 

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return tasks.count 
} 

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if segue.identifier == "ShowEditTask"{ 
    let v = segue.destination as! ViewController 
     let indexPath = self.tableView.indexPathForSelectedRow 
     let row = indexPath?.row 


    } 
} 
+0

您應該只發布與問題相關的代碼。否則,讀者需要時間來找出問題所在。例如'didReceiveMemoryWarning'和'viewDidLoad'不會導致問題。然後,如果可能,請指出引發異常的代碼行。你將有更多的機會獲得幫助! –

+1

主席先生,我清楚地表明我的問題在我的描述下面。 – danutha

+0

'results'是一組任務,'resultGot'是該數組中的一個任務,'expName'是key'name'的一個值。核心數據模型是什麼類型的?字符串我想?那你爲什麼試圖將它轉換爲一系列任務? – alexburtnik

回答

0

該錯誤消息說,NSTaggedPointerStringexpName)不能被強制轉換爲NSArray[Task]

你的目標是如果name屬性不是,則將所有Task s添加到任務數組中但您試圖添加名稱導致該錯誤。

幾點建議:

fetch(context:回報總是NSManagedObject子類的數組,以便立即施放它。

由於您使用的是NSManagedObject子類,因此直接獲取name屬性而不是valueForKey

不需要檢查> 0,因爲在空數組的情況下循環將被跳過。

let results = try context.fetch(request) as! [Task] 
    // check data existance 
    print(results.count) 

    for task in results { 
    if let expName = task.name { 
     print("expence name is :", expName) 
     tasks += task  
     print("my array is : \(tasks)") 
    } 
    }  

或更短

let results = try context.fetch(request) as! [Task] 
tasks.filter{ $0.name != nil } 

的最有效方式是過濾的任務之前通過適當的謂詞的獲取。

+0

守則trowing在行任務+ =任務 – danutha

+0

是不是'Task'的'NSManagedObject'子類的錯誤? – vadian

相關問題