Установщик списка не вызывается при добавлении нового значения - PullRequest
0 голосов
/ 28 мая 2019

У меня было решение этой проблемы, которое включает переназначение переменной для себя;однако это не кажется эффективным.

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]

Как видите, установщик не срабатывает при добавлении значения, что эффективно меняет значение коллекции.Есть ли лучший способ сделать это?

Вот ссылка на код на детской площадке Котлина

Причина, по которой мне это странно, из-за приведенного ниже кода в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 голосов
/ 11 июня 2019

Использование set(value) { } эквивалентно реализации установщика для этой переменной.Код, который вы предоставили, может быть интерпретирован как:

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 в списке, определенном в экземпляре x Example1.

Попробуйте позвонить x.listOfInt = mutableListOf(1,2,3), и вы увидите, что ваш установщик будет правильно вызван.

Для реализации того, что вы хотите сделать, есть несколько способов:

  1. Реализацияновая версия MutableList<>, которая переопределяет метод add (это может быть избыточным).
  2. Создайте метод add в вашем классе Example1, который будет выглядетьвот так:

    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)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...