Swift的Kotlin(或Java)结构?同一类的多个实例,对其变量进行变异

Ond*_*čík 2 java android ios kotlin swift

我不确定自己的头衔是否明确。在Swift中,我有这个结构。

struct Movement {
 let name: String
 var reps: Int
}

let movement1 = Movement(name: "Push Ups", reps: 20)

var movementA = movement1
movementA.reps = 30

print(movement1.reps) // Prints 20
print(movementA.reps) // Prints 30
Run Code Online (Sandbox Code Playgroud)

Kotlin(或Java)中的替代方法是什么?问题是在我的应用程序中,我的锻炼包含多个动作。我将这些动作附加到MutableList上,并且在进行重复动作的锻炼时出现问题。

例如,当我想输入锻炼内容时:

20俯卧撑

30个引体向上

40俯卧撑

我最终得到:

40俯卧撑

30个引体向上

40俯卧撑

首先,我选择运动#1并设置运动#1的代表,但是当我选择运动#3并设置运动#3的代表时,它将覆盖运动#1的变量。

任何的想法?

我已经尝试过类似的方法,但是没有用。

class Movement(name: String) {
 var reps: Int? = null
}
val movement1 = Movement("Push Ups")
movement1.reps = 20
var movementA = movement1
movementA.reps = 30
Log.i("REPS1: ", movement1.reps.toString()) // 30
Log.i("REPSA: ", movementA.reps.toString()) // 30
Run Code Online (Sandbox Code Playgroud)

Bub*_*tan 6

我从未使用过Swift,但是似乎您有一个可变的值,当您将其分配给新变量时,该值会被复制。在Kotlin中,您不能有这种类型。当给新变量赋值时,仅引用被复制,并且仍指向相同的确切存储位置。

您可以使用为您提供方便的复制方法的数据类:

data class Movement(val name: String, val reps: Int)

val movement1 = Movement("Push Ups", 20)
val movementA = movement1.copy(reps = 30)
Run Code Online (Sandbox Code Playgroud)

  • 使用数据类+ .copy() 解决了我的问题,谢谢! (2认同)

Tod*_*odd 6

movement1首先,让我解释为什么和具有相同的值movementA。当您在 Kotlin 中赋值时,您复制的是引用,而不是类。

var movementA = movement1
Run Code Online (Sandbox Code Playgroud)

因此,它的作用是创建一个名为 的新变量,并将其指向所指向的movementA完全相同的对象。movement1

我想您可能想看看数据类。它们带有一个可能会派上用场的复制构造函数。

data class Movement(val name: String, val reps: Int)
Run Code Online (Sandbox Code Playgroud)

然后您可以相互创建它们,就像上面显示的 swift 代码一样。

val movement1 = Movement("Push-Ups", 20)
val movementA = movement1.copy(reps = 30)
Run Code Online (Sandbox Code Playgroud)

或者你可以使用属性vars 而不是vals 并直接改变它们......

data class Movement(var name: String, var reps: Int)
var movement1 = Movement("Push-Ups", 20)
var movementA = movement1.copy()
movementA.reps = 30
Run Code Online (Sandbox Code Playgroud)