NSCoding 结构体和元组

问题描述 投票:0回答:1

我有一个包含一些 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)
            
} 

如有任何帮助,我们将不胜感激。

swift multidimensional-array tuples nscoding
1个回答
0
投票

我已经知道我哪里做错了。颜色和位置应定义为二维数组

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。

© www.soinside.com 2019 - 2024. All rights reserved.