Как использовать переменную из нескольких конструкторов в одной функции класса? - Kotlin - PullRequest
0 голосов
/ 27 апреля 2020

Я делаю простой класс данных с различными конструкторами. Я хочу сделать функцию доступной для обоих типов экземпляров без необходимости писать ее дважды. Как это можно сделать?

Пример:

class myClass private constructor() {

    constructor(
        weather: String, 
        day: Int?
    ) : this() {
        //I can put assignment here
    }
    constructor(
        day: Int?
    ) : this() {
        //and here, but can this be done more efficiently?
    }
    val dayString: String = when(day) { //kotlin doesn't recognize 'day' variable here outside of constructors...
        0 -> "Sunday"
        1 -> "Monday"
        2 -> "Tuesday"
        3 -> "Wednesday"
        4 -> "Thursday"
        5 -> "Friday"
        6 -> "Saturday"
        else -> "Not a valid day of the week!"
    }

}

1 Ответ

3 голосов
/ 27 апреля 2020

Так что в настоящее время day: Int? это просто параметр конструктора, а НЕ свойство экземпляра. Вы должны объявить его как val day: Int? в вашем главном конструкторе, чтобы dayString работал. Это, конечно, будет работать только для основного (основного) конструктора, и ваш класс будет выглядеть следующим образом:

class myClass private constructor(val day: Int?) {

    constructor(
            weather: String,
            day: Int?
    ) : this(day) {
        //I can put assignment here
    }

    val dayString: String = when(day) { //kotlin doesn't recognize 'day' variable here outside of constructors...
        0 -> "Sunday"
        1 -> "Monday"
        2 -> "Tuesday"
        3 -> "Wednesday"
        4 -> "Thursday"
        5 -> "Friday"
        6 -> "Saturday"
        else -> "Not a valid day of the week!"
    }
}

Если вы этого не сделаете, то: - добавьте значение по умолчанию для параметра конструкторов, например val day: Int? = null - или добавить свойство inte rnet для хранения (например, var _day: Int? = null)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...