附加新值时未调用列表设置器

时间:2019-05-27 21:07:46

标签: kotlin

对于这个问题,我有一个解决方法,其中涉及将变量重新分配给它自己。但是,这似乎并不有效。

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]

我知道我可能会比较苹果和橙子,但是我很好奇是否有更好的解决方案。

1 个答案:

答案 0 :(得分:0)

使用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)时,您是在add的{​​{1}}实例中定义的列表上调用x方法。

尝试致电Example1,您会看到您的二传手将被正确呼叫。

要实现您要执行的操作,有几种方法:

  1. 实施x.listOfInt = mutableListOf(1,2,3)的新版本,该版本将覆盖方法MutableList<>(此可能可能会过大)。
  2. 在您的add类中创建一个add方法,如下所示:

    Example1

您的主菜单现在看起来像这样:

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