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 元素数组中对应的 xy 坐标。例如

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 数组作为不同的结构的主要内容,如果未能解决你的问题,请参考以下文章

如何将不同类型的结构体作为一个函数的参数?

在数据结构中解析不同大小的数组 - Java

C 语言二级指针作为输入 ( 二维数组 | 二维数组遍历 | 二维数组排序 )

我怎么知道一个 CGPoint 数组是不是靠近另一个 CGPoint 数组?

带有指针作为参数的数组的函数

数据结构 -- 结构体Struct