无法转换类型' NSTaggedPointerString'到一个数组

时间:2016-10-27 06:29:55

标签: ios objective-c swift uitableview swift3

我正在开发一个用swift 3.0编写的项目。我的要求是保存我在某些文本字段中输入的数据,并将其中一个属性填充到表视图中,一旦选择了一行,我想更新该记录(在我的文本字段上重新分配值)。

但是当我尝试获取已保存在 core data 中的数据并将其分配到数组时,我的代码出现问题。基本上我有一个名为" 任务"它有三个属性,因为我想填充其中一个属性(称为" name"),我已经保存在核心数据上,到表视图我已经编写了如下代码。但我在我的代码中的以下行中得到一个例外,说" 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


    }
 }

1 个答案:

答案 0 :(得分:0)

错误消息显示NSTaggedPointerStringexpName)无法投放到NSArray[Task]

如果Task属性不是name,但您尝试添加名称,那么您的目标是将所有nil添加到任务数组中这会导致错误。

一些建议:

fetch(context:始终返回NSManagedObject子类的数组,以便立即转换它。

由于您使用的是NSManagedObject子类,因此请直接获取name属性,而不是使用valueForKey

检查&gt;不需要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  }

最有效的方法是通过适当的谓词过滤之前的任务。