如何在 Swift 中从 Realm 保存和加载 GKGameModelPlayer?
How to save and load GKGameModelPlayer from Realm in Swift?
我正在尝试在我的应用程序中实现 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定义为:
class Player : NSObject, GKGameModelPlayer {
var playerId: Int // GKGameModelPlayer protocol variable
let name: String
var cash: Int = 0
}
在我的项目中,我将领域实体和模型分开。所以会有一个PlayerEntity
和一个Player
class.
我想使用 RealmSwift
来保存和加载 GKGameModelPlayer
数据,更具体地说是 store/re-store 活跃玩家的能力。
我认为这里的关键是 playerId
变量;但我不确定。
但我不确定是否检索此信息,然后将其重新映射为有效的 GKGameModelPlayer
格式
我目前的idea/theory是我需要将我的模型映射到一个实体class,反之亦然。
即:
// [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"
}
}
然后我扩展这个 class 来做一些 "mapping":
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),因为我不确定如何设置它。
我可以将玩家保存到领域。
问题出在我尝试恢复播放器时,我想恢复 GameModel
中的 activePlayer 变量
因此,我的问题是:
我将如何保存和恢复 activePlayer
变量以使其继续符合 GKGameModelPlayer
?
感谢任何帮助。
谢谢
虽然您可以使用这些扩展程序,但有时越简单越好。这是一个粗略的例子:
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
只要是唯一的就很好用。
我正在尝试在我的应用程序中实现 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定义为:
class Player : NSObject, GKGameModelPlayer {
var playerId: Int // GKGameModelPlayer protocol variable
let name: String
var cash: Int = 0
}
在我的项目中,我将领域实体和模型分开。所以会有一个PlayerEntity
和一个Player
class.
我想使用 RealmSwift
来保存和加载 GKGameModelPlayer
数据,更具体地说是 store/re-store 活跃玩家的能力。
我认为这里的关键是 playerId
变量;但我不确定。
但我不确定是否检索此信息,然后将其重新映射为有效的 GKGameModelPlayer
格式
我目前的idea/theory是我需要将我的模型映射到一个实体class,反之亦然。
即:
// [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"
}
}
然后我扩展这个 class 来做一些 "mapping":
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),因为我不确定如何设置它。
我可以将玩家保存到领域。
问题出在我尝试恢复播放器时,我想恢复 GameModel
因此,我的问题是:
我将如何保存和恢复 activePlayer
变量以使其继续符合 GKGameModelPlayer
?
感谢任何帮助。
谢谢
虽然您可以使用这些扩展程序,但有时越简单越好。这是一个粗略的例子:
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
只要是唯一的就很好用。