无法将“NSTaggedPointerString”类型的值转换为数组

Posted

技术标签:

【中文标题】无法将“NSTaggedPointerString”类型的值转换为数组【英文标题】:Could not cast value of type 'NSTaggedPointerString' to an array 【发布时间】:2016-10-27 06:29:55 【问题描述】:

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

但是,当我尝试获取保存在 core data 中的数据并将它们分配给数组时,我的代码出现了问题。基本上我有一个名为“Task”的实体,它有三个属性,因为我想将我保存在核心数据上的那些属性(称为“名称”)之一填充到表格视图中我已经编写了如下代码。但是我在我的代码中的以下行中遇到了一个异常,说“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


    
 

【问题讨论】:

您应该只发布与问题相关的代码。否则,读者发现问题需要时间。例如didReceiveMemoryWarningviewDidLoad 不会导致问题。然后,如果可能,指出引发异常的代码行。您将有更多机会获得帮助! 先生,我已经在我的描述下明确指出了我遇到问题的那一行。 results 是一个任务数组,resultGot 是该数组中的一个任务,expName 是键 name 的值。核心数据模型的类型是什么?我想是字符串?那你为什么要把它转换成一个任务数组呢? 我对 swift 非常陌生,是的,数据模型的类型是字符串,基本上我希望在我的表格视图中填充“名称”。如果我尝试将代码编写为 tasks += expName 它会给我一条错误消息,说它无法像那样转换为预期的参数。我希望我的 expName 分配给任务数组 【参考方案1】:

错误信息说NSTaggedPointerStringexpName)不能转换为NSArray[Task]

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

一些建议:

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  

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

【讨论】:

Task 不是 NSManagedObject 的子类吗?

以上是关于无法将“NSTaggedPointerString”类型的值转换为数组的主要内容,如果未能解决你的问题,请参考以下文章

NSJSONSerialization生成NSCFString *和NSTaggedPointerString *

如何从 NSTaggedPointerString 中获取字符串? [复制]

替换 CloudKit 记录时遇到问题

SQL Server Management Studio 无法将类型为“System.__ComObject

为啥我无法正确获取图像数据或无法将数据发送到服务器?

无法将 createdAt 和 updatedAt 保存为日期时间值,也无法将后端保存为前端