2016-08-15 76 views
0

我正在使用Firebase,我正在嘗試數據庫[CGPoint] s的實時遊戲。我嘗試將結構類型更改爲[NSValue],因爲它至少符合AnyObject(請參閱下面的代碼),但現在出現運行時錯誤。有關如何將數據存入結構的任何建議,它會接受而不做一些瘋狂的事情?CGPoint數組作爲不同的結構

代碼

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在 settlementMap.0。只能存儲NSNumber類型的對象,NSString, NSDictionary和NSArray。'

回答

0

不是一個特別純溶液,但你存儲區CGPoint的2-元件陣列(陣列mimicing 2-元組)NSNumber元件,在這種情況下.first.last將用於訪問相應的xy座標,分別在「假元組」2元素數組中。例如。

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)] 
    } 
}