内部数据类

Inner data classes

谁能给我一些关于数据 classes 的小建议。我发现 Kotlin 的学习曲线非常陡峭,但我进展缓慢。

我有一个数据class:

data class newGame(
    val gamename: String,
    val gamedate: String,
    val players: List<Player>
) {
    data class Player(
        val player: String,
        val player_id: Int,
        val score: Int,
        val points: Int
    )
}

我可以创建外部 (newGame) 的实例 class,但我很难掌握如何添加玩家。我以为我可以做类似的事情:

var gm: newGame

gm.gamename = GamesList.text.toString()

val p = newGame.Player
p.player = Player1.text.toString()

gm.players.add p

但是 Android Studio 说我需要一个伴生对象,但我不确定它的外观如何

界面看起来像:

interface CreateGame {
    @POST("new")

    fun addNewGame(
        @Query("operation") operation: String,
        @Body() newGame: newGame
    ): Call<gameEvent>

companion object {

    fun create(): CreateGame {

        val retrofit = Retrofit.Builder()
            .addConverterFactory(GsonConverterFactory.create())
            .baseUrl(BaseURL)
            .build()
        return retrofit.create(CreateGame::class.java)
    }
}

我知道伴随对象 create() 如何创建游戏实例,但我不知道我需要写什么才能将玩家添加到内部 class。

有人可以指点一下吗?

嵌套class和内部class是有区别的。 嵌套 class 不能与内部 class 做同样的事情。内部 class 具有对其外部 class 实例的隐式引用。嵌套的 class 没有。

I can create an instance of the outer (newGame) class, but I'm struggling to get to grips with how I add Players. I thought I could do something like:

嗯,首先理解valvar这两个术语。 属性 gamename 是 val 这意味着它是只读的,要编写它你必须将它设为 var,所有其他属性也是如此。 players 应为 mutableListOfArrayList<> 类型,以便稍后修改。 List是不可变的,也就是说初始化后不能添加。

data class newGame(
    var gamename: String,
    var gamedate: String,
    var players: ArrayList<Player>
)
data class Player(
    var player: String,
    var player_id: Int,
    var score: Int,
    var points: Int
)

现在在你的情况下,你需要添加一个辅助构造函数或初始化所有属性,同时声明如下

data class newGame(
    var gamename: String? = null,
    var gamedate: String? = null,
    var players: ArrayList<Player> = ArrayList()
)
data class Player(
    var player: String?=null,
    var player_id: Int?=null,
    var score: Int?=null,
    var points: Int?=0
)

主要class

    var gm: newGame = newGame()

    gm.gamename = "GamesList.text.toString()"

    val p = Player()
    p.player = "Player1.text.toString()"

    gm.players.add(p)

您拥有的是 nested class,我认为您的用例不需要这种结构。您只需将 Player class 移到 newGame class 之外。然后你可以创建 newGame 的对象为

// Create Player objects by passing appropriate values to the constructor
val playerA = Player(player = "A", player_id = 1, score = 50, points = 50)
val playerB = Player(player = "B", player_id = 2, score = 60, points = 80)

// Create a newGame
val newGame = newGame(gamename = "MyGameName", gamedate = "GameDate", players = listOf(playerA, playerB))