Как сохранить и загрузить GKGameModelPlayer из Realm в Swift? - PullRequest
0 голосов
/ 09 мая 2020

Я пытаюсь реализовать GKGameModel в своем приложении. В нем он содержит переменные для нескольких вещей, но для целей моего вопроса меня интересуют следующие две переменные:

import GameplayKit
final class GameModel: NSObject, GKGameModel {
    var players: [GKGameModelPlayer]?
    var activePlayer: GKGameModelPlayer?
}

Я делаю что-то вроде этого, чтобы инициализировать игру с 3 игроками ( неточно)

let game = GameModel.init()
game.players = [Player(),Player(),Player()] // Create 3 players
guard let firstPlayer = game.players.first else {
     return
}
game.activePlayer = firstPlayer

Класс игрока определяется как:

class Player : NSObject, GKGameModelPlayer {
    var playerId: Int // GKGameModelPlayer protocol variable
    let name: String
    var cash: Int = 0
}

В моем проекте у меня есть Realm Entities и модели разделены. Таким образом, будут классы PlayerEntity и Player.

Я хочу использовать RealmSwift для сохранения и загрузки данных GKGameModelPlayer и, в частности, возможность сохранять / повторно сохранить активного игрока.

Я думаю, что ключ здесь - переменная playerId; но я не уверен.

Но в чем я не уверен, так это в получении этой информации и последующем преобразовании ее в действительный формат GKGameModelPlayer

Моя текущая идея / теория заключается в том, что Мне нужно сопоставить мою модель с классом сущности и наоборот.

Ie:

// [REALM] Player entity
class PlayerEntity: Object {
    @objc dynamic var id = UUID().uuidString
    @objc dynamic var playerId: Int = 0
    @objc dynamic var name: String = ""
    @objc dynamic var cash: Int = 0

    override static func primaryKey() -> String {
       return "id"
    }
}

И затем я расширяю этот класс, чтобы выполнить некое «сопоставление»:

extension PlayerEntity {
    // Map model -> entity
    convenience init(model: Player) {
        self.init()

        self.playerId = model.playerId
        self.name = model.name
        self.cash = model.cash
    }
}

extension Player {
    // Map entity -> model
    convenience init(entity: PlayerEntity) {
        let playerId = entity.playerId
        let name = entity.name
        let cash = entity.cash

        self.init(id: playerId, name: name, cash: cash)
    }
}

Прямо сейчас playerId всегда равен нулю (0), потому что я не совсем уверен, как его установить.

Я могу сохранить игрока в игровом мире.

Проблема возникает, когда я пытаюсь восстановить проигрыватель, и я хочу восстановить переменную activePlayer в GameModel

Поэтому мой вопрос:

Как мне go о сохранении и восстановлении переменной activePlayer, чтобы она продолжала соответствовать GKGameModelPlayer?

Я благодарен за любую помощь по этому поводу.

С благодарностью

1 Ответ

1 голос
/ 09 мая 2020

Хотя вы можете использовать эти расширения, иногда лучше проще. Вот примерный пример:

class PlayerEntity: Object {
    @objc dynamic var playerId: Int = 0
    @objc dynamic var name: String = ""
    @objc dynamic var cash: Int = 0

    convenience init(withPlayer: PlayerClass) {
       self.init()
       self.playerId = withPlayer.playerId
       self.name = withPlayer.name
       self.cash = withPlayer.cash
    }

    func getPlayer() -> Player {
       let p = Player()
       p.playerId = self.playerId
       p.name = self.name
       p.cash = self.cash
       return p
    }

    override static func primaryKey() -> String {
       return "playerId"
    }
}

, чтобы загрузить всех игроков в массив ... это сделает это

let playerResults = realm.objects(PlayerEntity.self)
for player in playerResults {
   let aPlayer = player.getPlayer()
   self.playerArray.append(aPlayer)
}

Обратите внимание на удаление

@objc dynamic var id = UUID().uuidString

потому что на самом деле он не используется для идентификации объекта как первичного ключа.

Первичный ключ действительно

var playerId: Int // GKGameModelPlayer protocol variable

, который можно использовать, если он уникален.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...