Swift 在 Kotlin(或 Java)中的结构?同一类的多个实例,改变其变量

Posted

技术标签:

【中文标题】Swift 在 Kotlin(或 Java)中的结构?同一类的多个实例,改变其变量【英文标题】:Swift's struct in Kotlin (or Java)? Multiple instances of the same class, mutating its variables 【发布时间】:2018-09-21 22:11:12 【问题描述】:

我不确定我是否清楚我的头衔。在 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

在 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

【问题讨论】:

Java 有Object.clone(),它可以在任何标记为Cloneable 的东西上工作(嗯,做某事)。但我不知道这种机制在 Kotlin 中是如何出现的。 为什么不能只创建一个Movement 的新实例,而不是将其分配给另一个变量? Java 在处理副本方面有点奇怪,但这里有一些关于该主题的不错的 SO 线程:***.com/questions/6182565/… 和 ***.com/questions/869033/… 【参考方案1】:

我从未使用过 Swift,但您似乎拥有一个可变值,当您将它分配给一个新变量时该值会被复制。在 Kotlin 中,你不能有这样的类型。当你给一个新变量赋值时,只有引用被复制,它仍然指向同一个确切的内存位置。

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

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

val movement1 = Movement("Push Ups", 20)
val movementA = movement1.copy(reps = 30)

【讨论】:

使用数据类 + .copy() 解决了我的问题,谢谢!【参考方案2】:

首先,让我解释一下为什么 movement1movementA 的值相同。在 Kotlin 中分配时,您复制的是引用,而不是类。

var movementA = movement1

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

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

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

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

val movement1 = Movement("Push-Ups", 20)
val movementA = movement1.copy(reps = 30)

或者您可以创建属性 vars 而不是 vals 并直接对其进行变异...

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

【讨论】:

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

以上是关于Swift 在 Kotlin(或 Java)中的结构?同一类的多个实例,改变其变量的主要内容,如果未能解决你的问题,请参考以下文章

如何将 React-Native 代码与 Swift 或 Kotlin 联系起来?我应该用每种语言做啥?

Kotlin/Native 垃圾收集器如何在 C 中工作?

Swift VS Kotlin

Swift一路走低,Kotlin能否逆袭?

如何解决本机 Java 或 Kotlin 中的错误“在依赖项的 AAR 元数据中指定的 minCompileSdk (31)”? [复制]

Kotlin:Android世界的Swift