Где объявить функции расширения Kotlin в приложении для Android - PullRequest
0 голосов
/ 20 февраля 2019

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

fun <T> MutableList<T>.swap(index1: Int, index2: Int) {
    val tmp = this[index1] // 'this' corresponds to the list
    this[index1] = this[index2]
    this[index2] = tmp
}

, и я хочу использовать его в любом месте моего приложения следующим образом:

val l = mutableListOf(1, 2, 3)
l.swap(0, 2)

Поправьте меня, если я ошибаюсь, но я считаю, что объявления расширения функций могут существовать вне класса.Итак, в каком приложении Android я бы поместил эту декларацию?Или это вообще имеет значение?Будет ли компиляция просто компилировать код независимо от того, где объявлено расширение и сделать его повторно используемым глобально, или я должен сделать его частью класса?

Ответы [ 4 ]

0 голосов
/ 20 февраля 2019

Чтобы расширение было глобальным, вам нужно поместить его вне класса

package com.extension.globalcontext

fun <T> MutableList<T>.swap(index1: Int, index2: Int)

И чтобы вызвать его, вам нужно импортировать пакет

import com.extension.globalcontext
l.swap(0, 2)
0 голосов
/ 20 февраля 2019

Вы можете создать некоторый файл, например, ListExt.kt где угодно (например, в пакете main_package_name/util/ListExt.kt) и разместить там функцию расширения, и она будет доступна во всем проекте.Таким образом, содержимое файла ListExt.kt может быть:

package main_package_name.util

fun <T> MutableList<T>.swap(index1: Int, index2: Int) {
    val tmp = this[index1] // 'this' corresponds to the list
    this[index1] = this[index2]
    this[index2] = tmp
}

// other extension functions on the Lists
0 голосов
/ 20 февраля 2019

Они могут быть где угодно, но, кажется, имеет смысл иметь расширения для определенного класса в одном файле и / или пакете.Например, расширения для String могут находиться в StringExtensions.kt, а также могут быть в пакете расширений.

0 голосов
/ 20 февраля 2019

Да, функции расширения могут быть объявлены где угодно.

Для функций общих утилит (относительно списков) я бы поместил их в нечто вроде /company/app/util/lists.kt.

...