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】:首先,让我解释一下为什么 movement1
和 movementA
的值相同。在 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)
或者您可以创建属性 var
s 而不是 val
s 并直接对其进行变异...
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 联系起来?我应该用每种语言做啥?
如何解决本机 Java 或 Kotlin 中的错误“在依赖项的 AAR 元数据中指定的 minCompileSdk (31)”? [复制]