#android #kotlin
#Android #kotlin
Вопрос:
fun updatePath(query: String?){
this.query = query
}
fun build(): String {
if (!query.isNullOrEmpty()) {
val encodedQuery = encode(query)
}
}
encode()
принимает только ненулевую строковую переменную.
но здесь он все еще жалуется на запрос, который я передаю?
Я ожидал, что использование isNullOrEmpty()
должно решить эту проблему.
Ответ №1:
Вы можете использовать функцию kotlin Scope с нулевой безопасностью, чтобы избежать таких предупреждений.
Вот так —
fun build(): String {
query?.let {
if (it.isNotEmpty()) {
val encodedQuery = encode(query)
}
}
}
РЕДАКТИРОВАТЬ: Спасибо @Tenfour04 за уведомление об этом, мы должны использовать экземпляр внутри блока.
fun build(): String {
query?.let { it ->
if (it.isNotEmpty()) {
val encodedQuery = encode(**it**)
}
}
}
Комментарии:
1. Это все равно не сработает, потому что
query
имеет значение null. Вам понадобитсяencode(it)
.2. Спасибо @Tenfour04, я полностью пропустил это. Не использовал объект контекста внутри.
Ответ №2:
Я бы использовал smartcast или, возможно takeIf
, чтобы избежать вложенности.
query?.takeIf { it.isNotEmpty() }?.let {
encode(it)
}
Ответ №3:
Если encode
принимает любую ненулевую строку (включая пустую строку), то вы могли бы сделать следующее.
fun build(): String {
...
val encodedQuery = query?.let(::encode)
...
}
Ответ №4:
Компилятор не может выполнять smartcast, поскольку ваш запрос является var
, поэтому он может измениться. Вы могли бы сделать следующее: val query = query
Перед if
Это затеняет запрос имени. Вы все еще можете использовать свойство запроса через this.query