2015-11-05 58 views
2

使用的GameKit多人遊戲(EasyGameCenter)之間unsafeBitCast:https://github.com/DaRkD0G/Easy-Game-Center-Swift致命錯誤:無法找到這裏類型不同尺寸(使用的GameKit)

在兩名球員連接我得到一個崩潰在這條線

let playerIDs = match.players.map { $0 .playerID } as! [String] 

有了這個控制檯

fatal error: can't unsafeBitCast between types of different sizes

任何想法?下面是簡單的參考全功能:

@available(iOS 8.0, *) 
    private func lookupPlayers() { 

     guard let match = EGC.sharedInstance.match else { 
      EGC.printLogEGC("No Match") 
      return 
     } 

     let playerIDs = match.players.map { $0 .playerID } as! [String] 

     /* Load an array of player */ 
     GKPlayer.loadPlayersForIdentifiers(playerIDs) { 
      (players, error) in 

      guard error == nil else { 
       EGC.printLogEGC("Error retrieving player info: \(error!.localizedDescription)") 
       EGC.disconnectMatch() 
       return 
      } 

      guard let players = players else { 
       EGC.printLogEGC("Error retrieving players; returned nil") 
       return 
      } 
      if EGC.debugMode { 
       for player in players { 
        EGC.printLogEGC("Found player: \(player.alias)") 
       } 
      } 

      if let arrayPlayers = players as [GKPlayer]? { self.playersInMatch = Set(arrayPlayers) } 

      GKMatchmaker.sharedMatchmaker().finishMatchmakingForMatch(match) 
      (Static.delegate as? EGCDelegate)?.EGCMatchStarted?() 

     } 
    } 
+0

如果將該行分成兩行,該怎麼辦?將地圖的值存儲到一行中的臨時變量,然後將其轉換爲下一行的「[String]」。你仍然看到同樣的問題? –

+0

不知道我會怎麼做,新的迅速。這段代碼是從EasyGameCenter github – Jenna25

+0

'let tempPlayerIDs = match.players.map {$ 0 .playerID}',然後是'let playerIDs = tempPlayerIDs as! [String]' –

回答

5

的問題是,你的map語句導致類型的Array<String?>因爲playerIDString?,你不能直接轉換爲Array<String>

如果你確信你將永遠有一個playerID值,你可以改變聲明

match.players.map { $0.playerID } 

到:如果你不能確定的是

match.players.map { $0.playerID! } 

,那麼你就可以或者使用Array<String?>值進行適當的可選處理,或通過從map切換爲flatMap刪除nil值:

match.players.flatMap { $0.playerID } 
相關問題