我不明白为什么下面的代码不能工作:
import Foundation
import SpriteKit
var TestVector: CGVector = CGVector(dx: 1, dy: 1)
var Data: Dictionary<String, Any> = ["abc":CGPoint(x: 0, y: 0), "def":1, "ghi":"Try", "jkl":TestVector]
let DataConverted: Data = NSKeyedArchiver.archivedData(withRootObject: Data)
let DataReceived: Dictionary = (NSKeyedUnarchiver.unarchiveObject(with: DataConverted) as! [String : Any])错误抛出为:错误:执行中断,原因:信号SIGABRT。进程已经被中断,请使用线程返回-x返回到表达式求值前的状态。
对于许多不同类型的数据(String、Int、Double等),一切都工作得很好。但是它对矢量不起作用。
可以通过NSKeyedArchiver归档的数据类型是否有限制?
Thx
J.
发布于 2017-10-13 22:49:56
查看NSValue,它在这个场景中非常完美。
像NSValue(cgVector: TestVector)一样添加它,当你从字典中读回它时,只需要像这样let vector = cgVectorValue.cgVectorValue一样把它作为CGVector返回
在您的情况下,您需要:
var TestVector: CGVector = CGVector(dx: 1, dy: 1)
let vectorValue = NSValue(cgVector: TestVector)
let pointValue = NSValue(cgPoint:CGPoint(x: 0, y: 0))
var Data: Dictionary<String, Any> = ["abc":pointValue, "def":1, "ghi":"Try", "jkl":vectorValue]
let DataConverted: Data = NSKeyedArchiver.archivedData(withRootObject: Data)
let DataReceived: Dictionary = (NSKeyedUnarchiver.unarchiveObject(with: DataConverted) as! [String : Any])
if let vectorValue = DataReceived["jkl"] as? NSValue {
let vector = vectorValue.cgRectValue
}
if let pointValue = DataReceived["abc"] as? NSValue {
let point = vectorValue.cgPointValue
}苹果公司一直在使用它,也许你已经看过了,当你收到键盘将显示的通知时,在userInfo字典中,你可以使用以下命令获取键盘大小
CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size请注意使用NSValue封装的CGRectValue get CGRect
来自苹果公司的文档:
NSValue对象可以包含任何标量类型,如int、float和char,以及指针、结构和对象id引用。使用这个类来处理集合(比如NSArray和NSSet)、键值编码和其他需要Objective-C对象的API中的数据类型。NSValue对象总是不可变的。
有关https://developer.apple.com/documentation/foundation/nsvalue的更多信息
https://stackoverflow.com/questions/46731212
复制相似问题