【问题标题】:List setter is not being called when appending a new value追加新值时未调用列表设置器
【发布时间】:2019-10-13 09:46:40
【问题描述】:

我有一个解决这个问题的解决方案,它涉及将变量重新分配给它自己;但是,这似乎效率不高。

fun main() {

    val x = Example1()
    x.listOfInt = mutableListOf(3,4)
    x.listOfInt.add(455)
}

class Example1 {

  var listOfInt: MutableList<Int> = mutableListOf()
    set(value) { 
        println("setting it here to value => $value")
         field = value 
    }
}
// It only prints:
// setting it here to value => [3, 4]

如您所见,当附加值时设置器不会被触发,这有效地改变了集合的值。有没有更好的方法来做到这一点?

这是 Kotlin 的 playground 上的代码链接

这对我来说很奇怪,因为 Swift 中的以下类似代码在附加数组时会达到预期的效果:

import Foundation

class Example1 {
  var fieldProperty: Int = 0

  var listOfInt: [Int] = [] {
    didSet { 
        print("setting it here to value => \(listOfInt) vs oldValue: \(oldValue)")      
    }
  }
}

let x = Example1()
x.listOfInt = [3,4]
x.listOfInt.append(455)

// this prints:
// setting it here to value => [3, 4] vs oldValue: []
// setting it here to value => [3, 4, 455] vs oldValue: [3, 4]

我知道我可能会将苹果与橙子进行比较,但我只是好奇是否有更好的解决方案。

【问题讨论】:

  • 附加值时有效地改变了集合的值,但它不会改变listOfInt的值。当您将项目附加到列表时,列表的值不会改变。它与新项目相同。
  • 只有在Example1 对象内重新分配变量listOfInt 时才会调用set,而不是在调用该变量上的方法时调用,例如add()
  • 如果您不希望任何人在不使用 setter 的情况下更改 x 引用的列表的内容,请不要使用可变列表。使用不可变的。

标签: kotlin


【解决方案1】:

set(value) { } 的使用等同于在该变量上实现 setter。 您提供的代码可以解释为:

class Example1 {

    var listOfInt: MutableList<Int> = mutableListOf()

    fun set(value: MutableList<Int>) { 
        println("setting it here to value => $value")
        this.listOfInt = value 
    }
}

当您调用x.listOfInt.add(455) 时,您正在调用xExample1 实例中定义的列表中的add 方法。

尝试调用x.listOfInt = mutableListOf(1,2,3),你会看到你的setter会被正确调用。

要实现你想做的,有几种方法:

  1. 实现MutableList&lt;&gt; 的新版本,它会覆盖add 方法(这可能有点矫枉过正)。
  2. Example1 类中创建一个add 方法,如下所示:

    fun add(value: Int) {
        println("adding value to list => $value")
        listOfInt.add(value)
    }
    

你现在看起来像这样:

fun main() {
    val x = Example1()
    x.listOfInt = mutableListOf(3,4)
    x.add(455)
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-22
    • 1970-01-01
    • 2017-02-06
    • 2010-12-27
    • 1970-01-01
    • 2012-11-11
    相关资源
    最近更新 更多