2017-10-13 31 views
0

我想不通,为什么下面的代码不工作:存储载体中的NSData斯威夫特

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”返回表达式评估之前的状态。

一切都为很多不同类型的数据(字符串,整数,双,...)的工作正常,但它不工作的载体

是在数据的类型有限制可以存档通过NSKeyedArchiver?

THX

J.

附加信息:这是在MultipeerConnectivy数据传输

+0

'CGPoint'不应该默认不能被转换为这样的成' (NS)数据“,因此无法归档。 'TestVector'也一样。你需要符合'NSCoder'协议。 – Larme

+0

Thx。然而,它正在为CGPoint工作。只有CGVector类型会引发错误。你能告诉如何符合CGPoint和CGVector到NSCoder协议,什么是最好的语法? – jbegood

+2

@Larme你的意思是'NSCoding' –

回答

0

退房NSValue使用,它是在这种情况下完美。

添加像NSValue(cgVector: TestVector),当你从字典读回刚拿回来的CGVector像这样let vector = cgVectorValue.cgVectorValue

你的情况,你这样做:

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 

注意的CGRectValue,得到的CGRect这是使用NSValue

封装从苹果的文档:

An NSValue object can hold any of the scalar types such as int, float, and char, as well as pointers, structures, and object id references. Use this class to work with such data types in collections (such as NSArray and NSSet), Key-value coding, and other APIs that require Objective-C objects. NSValue objects are always immutable.

更多关于https://developer.apple.com/documentation/foundation/nsvalue

+0

Thx,但它不工作。错误是:终止应用程序由于未捕获的异常'NSInvalidArgumentException',原因:'*** - [NSKeyedArchiver encodeValueOfObjCType:at:]:此归档程序无法编码结构' 在行“let DataConverted ...” – jbegood

+0

我更新了答案,你也有一个CGPoint那里,你包装在NSValue以及你可以看到上面,然后它必须工作 – Ladislav

+0

我倾向于同意其他人评论有关创建符合NSCoding协议的自定义类... – Ladislav