我有一个包含一些 CGPoint 和元组数组的结构:
typealias MapNode = (color: UIColor, location: CGPoint)
struct MapCollectionNode {
var position: CGPoint
var containedLocations: [MapNode]
}
然后我有一个由 MapCollectionNode 组成的数组:
var nodeCollection = [MapCollectionNode]()
由于 NSCoding 不支持结构体和元组,我必须首先按如下方式分解 nodeCollection:
var position = [CGPoint]()
var nodes = [[MapNode]]()
for n in nodeCollection {
position.append(n.position)
nodes.append(n.containedLocations)
}
然后我必须进一步分解节点内的元组,如下所示:
var color = [SKColor]()
var location = [CGPoint]()
for i in 0..<nodes.count {
for j in nodes[i] {
color.append(j.color)
location.append(j.location)
}
}
此时我可以对我需要的所有信息进行编码:
aCoder.encode(position, forKey: "MapClass.position")
aCoder.encode(color, forKey: "MapClass.color")
aCoder.encode(location, forKey: "MapClass.location")
在解码时,我将它们全部解码如下:
let position = aDecoder.decodeObject(forKey: "MapClass.position") as? [CGPoint]
let color = aDecoder.decodeObject(forKey: "MapClass.color") as? [SKColor]
let location = aDecoder.decodeObject(forKey: "MapClass.location") as? [CGPoint]
但是,我一直困惑于如何将颜色和位置放回节点(这是一个 [[MapNode]])。完成后,我可以执行以下操作来重建 nodeCollection:
for i in 0..< position!.count {
let nodeCollection = MapCollectionNode(position: position![i], containedLocations: nodes[i])
self.nodeCollection.append(nodeCollection)
}
如有任何帮助,我们将不胜感激。
我已经知道我哪里做错了。颜色和位置应定义为二维数组
var color = [[SKColor]]()
var location = [[CGPoint]]()
for i in 0..< nodes.count {
var c = [SKColor]()
var l = [CGPoint]()
for j in 0..<nodes[i].count {
c.append(collection[i][j].color)
l.append(collection[i][j].location)
}
color.append(c)
location.append(l)
}
这样我就可以毫无困难地将它们恢复回 [[MapNode]] 数组,然后重建 nodeCollection。