Инициировать свойство с помощью сеттера в основном конструкторе в Kotlin - PullRequest
0 голосов
/ 26 ноября 2018

У меня есть следующий код:

class Camera : AsyncActiveInputDevice<Image> {
    constructor(inputListener: ((Image) -> Unit)? = null) {
        this.inputListener = inputListener
    }

    override var inputListener: ((Image) -> Unit)?
        set(value) {
            field = value
            TODO("call C/Python implementation")
        }
}

И IntelliJ IDEA предлагает преобразовать конструктор в первичный конструктор.

Так как же это преобразовать?Как инициировать свойство с помощью сеттера в основном конструкторе?Я пробовал блоки init, но затем выдает ошибку: «Переменная не может быть инициализирована до объявления».

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

Блок инициализации должен прийти после объявления переменной.Вот что говорит вам сообщение об ошибке:

class Camera(inputListener: ((Image) -> Unit)? = null): AsyncActiveInputDevice<Image> {

    override var inputListener: ((Image) -> Unit)? = inputListener
        set(value) {
            field = value
            TODO("call C/Python implementation")
        }


    init {
        this.inputListener = inputListener
    }
}
0 голосов
/ 26 ноября 2018

Такой первичный конструктор будет помещаться в заголовок класса, например:

class Camera(inputListener: ((Image) -> Unit)? = null) : AsyncActiveInputDevice<Image> {

    override var inputListener: ((Image) -> Unit)? = inputListener
        set(value) {
            field = value
            TODO("call C/Python implementation")
        }

}

Это преобразование можно выполнить в среде IDE, вызвав намеренные действия для предупреждения ( Alt +Введите в Windows, ⌥↩ в macOS) и выберите Преобразовать в основной конструктор .

...