我正在开发一个用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
}
}
答案 0 :(得分:0)
错误消息显示NSTaggedPointerString
(expName
)无法投放到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 }
最有效的方法是通过适当的谓词过滤之前的任务。