【问题标题】:fatal error: can't unsafeBitCast between types of different sizes (using gamekit)致命错误:不能在不同大小的类型之间使用 unsafeBitCast(使用 gamekit)
【发布时间】:2015-11-05 17:17:12
【问题描述】:

使用 GameKit 多人游戏功能 (EasyGameCenter) 可在此处找到:https://github.com/DaRkD0G/Easy-Game-Center-Swift

当两个玩家连接时,我在这条线上遇到了崩溃

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

在控制台中使用这个

致命错误:不能在不同大小的类型之间使用 unsafeBitCast

有什么想法吗?以下是完整功能,方便参考:

 @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?()

        }
    }

【问题讨论】:

  • 如果你把那行分成两行怎么办。将映射的值存储到一行的临时变量中,然后在下一行将其转换为[String]。你还看到同样的问题吗?
  • 不知道该怎么做,新来的 swift。此代码来自 EasyGameCenter github
  • let tempPlayerIDs = match.players.map { $0 .playerID } 后跟let playerIDs = tempPlayerIDs as! [String]
  • 不幸的是,仍然发生,现在在 let playerIDs 行。
  • 看起来 playerID 是一个字符串?类型,如果你把match.players.map { $0.playerID }改成match.players.map { $0.playerID! }

标签: swift game-center gamekit


【解决方案1】:

问题是您的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 }

【讨论】:

    猜你喜欢
    • 2015-10-21
    • 2015-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多