gpt4 book ai didi

ios - 无法将类型 'NSTaggedPointerString' 的值转换为数组

转载 作者:行者123 更新时间:2023-11-30 12:57:21 25 4
gpt4 key购买 nike

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

但是,当我尝试获取保存在核心数据中的数据并将它们分配给数组时,我的代码出现了问题。基本上我有一个名为“任务”的实体,它具有三个属性,因为我想将我保存在核心数据上的这些属性之一(称为“名称”)填充到 TableView 中我编写的代码如下。但是我在代码中的以下行中遇到异常,说“无法将 NSTaggedPointerString (0x10d8f7b90) 类型的值转换为 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


}
}

最佳答案

错误消息指出 NSTaggedPointerString (expName) 无法转换为 NSArray ([Task] )

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

一些建议:

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 }

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

关于ios - 无法将类型 'NSTaggedPointerString' 的值转换为数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40277660/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com