Intereting Posts
Почему конструктор Intent невидим в сопутствующем объекте? Котлин AndroidStudio ExternalSystemException с kotlin 0.12.213 Почему URL ("http://pboss.pozit.pl/contact.html") .readText () делает сбой приложения для Android? Могу ли я создать KType из reified T Android Spinner не отвечает за клики, не закрывается, а OnItemSelectedListener не срабатывает java.lang.IllegalArgumentException: параметр, заданный как ненулевой, равен null: метод kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull В android kotlin, используя библиотеку степпера, передавая пользовательские значения переключателей по нескольким фрагментам, которые будут использоваться на сводной странице Эффективный способ добавления строк, разделенных запятой Синтаксис функции Kotlin Kotlin – объявить общий класс с параметром типа, который является общим Как сделать вывод типа Котлин из отражения KClass? Конфигурация Maven для использования Dagger 2 в смешанном проекте Java / Kotlin RegisterResGeneratingTask устарел, используйте registerGeneratedFolders (FileCollection) Kotlin – извлечение списка родительских объектов предметов в коллекции Kotlin в xml onClick не работает

Лучший способ обработки возвратов в предикате

Когда я возвращаю функцию в предикат, компилятор не регистрирует ее и все еще жалуется

Для функции с блочным телом требуется выражение 'return'

Решение, которое я нашел, бросает бросок после предиката.

fun boo(): Int { sth.apply { return sthElse } throw Exception("Unkown View type") } 

Интересно, есть ли более милостивый путь.

ps: фактический код Android

 override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): RecyclerView.ViewHolder { LayoutInflater.from(parent?.context) .inflate(R.layout.item_category_node, parent, false) .apply { return CategoryNodeViewHolder(this, this@CategoriesAdapter) } throw Exception("View type error") } 

EDIT: после просмотра вашего примера:

  override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int) = LayoutInflater.from(parent?.context) .inflate(R.layout.item_category_node, parent, false) .let { CategoryNodeViewHolder(this, this@CategoriesAdapter) } 

В этих ситуациях следует использовать функцию расширения «run». По словам kotlin docs

Вызывает указанный функциональный блок и возвращает его результат.

Теперь мой код выглядит так

 override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): RecyclerView.ViewHolder { return LayoutInflater.from(parent?.context) .inflate(R.layout.item_category_node, parent, false) .run { CategoryNodeViewHolder(this, this@CategoriesAdapter) } //throw Exception("Unkown View type") } 

У функции apply уже есть оператор возврата объекта, на который он вызван, см. https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/apply.html

 override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int) = CategoryNodeViewHolder( LayoutInflater.from(parent?.context).apply{ inflate(R.layout.item_category_node, parent, false) }, this@CategoriesAdapter) 

Теперь он возвращает правильный тип объекта для метода, создавая экземпляр layoutInflater, а также применяя инфляцию, необходимую для CategoryNodeViewHolder, прежде чем он будет использоваться для создания экземпляра CategoryNodeViewHolder.