CGPoint 数组作为不同的结构
Posted
技术标签:
【中文标题】CGPoint 数组作为不同的结构【英文标题】:CGPoint array as a different struct 【发布时间】:2016-08-15 18:34:43 【问题描述】:我正在使用 Firebase,我正在尝试为实时游戏创建数据库 [CGPoint]
s。我尝试将结构类型更改为[NSValue]
,因为至少它符合 AnyObject(请参见下面的代码),但现在我收到运行时错误。关于如何将我的数据放入它可以接受的结构而不做一些疯狂的事情有什么建议吗?
代码
func convert(points : [CGPoint]) -> [NSValue]
var tup = [NSValue]()
for x in points
tup.append(NSValue(CGPoint: x))
return tup
func updateMap()
var userMap = [String:[AnyObject]]()
userMap["forbiden"] = convert(forbiden)
userMap["roadMap"] = convert(roadMap)
userMap["settlementMap"] = convert(settlementMap)
userMap["upgradeMap"] = convert(upgradeMap)
self.ref.child(altUser+"/"+groupName+"/"+username).setValue(userMap)
运行时错误
由于未捕获的异常“InvalidFirebaseData”而终止应用, 原因:'(setValue:) 无法将 NSConcreteValue 类型的对象存储在 定居点地图.0。只能存储 NSNumber、NSString、 NSDictionary 和 NSArray。'
【问题讨论】:
【参考方案1】:不是一个特别简洁的解决方案,但您可以将您的 CGPoint
存储为 NSNumber
元素的 2 元素数组(模拟 2 元组的数组),在这种情况下 @ 987654323@ 和 .last
将分别用于访问“假元组”2 元素数组中对应的 x
和 y
坐标。例如
func convert(points : [CGPoint]) -> [[NSNumber]]
var fakeTuples = [[NSNumber]]()
for point in points
fakeTuples.append([NSNumber(double: point.x.native),
NSNumber(double: point.y.native)])
return fakeTuples
或者,以更紧凑的形式
func convert(points : [CGPoint]) -> [[NSNumber]]
return points.map
[NSNumber(double: $0.x.native),
NSNumber(double: $0.y.native)]
【讨论】:
如何将[[NSNumber]]
转换回CGPath
?以上是关于CGPoint 数组作为不同的结构的主要内容,如果未能解决你的问题,请参考以下文章
C 语言二级指针作为输入 ( 二维数组 | 二维数组遍历 | 二维数组排序 )