无法将“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
【问题讨论】:
您应该只发布与问题相关的代码。否则,读者发现问题需要时间。例如didReceiveMemoryWarning
和viewDidLoad
不会导致问题。然后,如果可能,指出引发异常的代码行。您将有更多机会获得帮助!
先生,我已经在我的描述下明确指出了我遇到问题的那一行。
results
是一个任务数组,resultGot
是该数组中的一个任务,expName
是键 name
的值。核心数据模型的类型是什么?我想是字符串?那你为什么要把它转换成一个任务数组呢?
我对 swift 非常陌生,是的,数据模型的类型是字符串,基本上我希望在我的表格视图中填充“名称”。如果我尝试将代码编写为 tasks += expName 它会给我一条错误消息,说它无法像那样转换为预期的参数。我希望我的 expName 分配给任务数组
【参考方案1】:
错误信息说NSTaggedPointerString
(expName
)不能转换为NSArray
([Task]
)
如果name
属性不是nil
,但您尝试添加导致错误的名称,您的目标是将所有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
最有效的方法是通过适当的谓词过滤之前获取的任务。
【讨论】:
Task
不是 NSManagedObject
的子类吗?以上是关于无法将“NSTaggedPointerString”类型的值转换为数组的主要内容,如果未能解决你的问题,请参考以下文章
NSJSONSerialization生成NSCFString *和NSTaggedPointerString *
如何从 NSTaggedPointerString 中获取字符串? [复制]