在Android应用中声明Kotlin扩展功能的位置

时间:2019-02-20 10:51:39

标签: android kotlin kotlin-extension

假设我要制作以下代码作为可重用组件:

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 :(得分:4)

您可以创建一些文件,例如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

答案 1 :(得分:1)

它们可以在任何地方,但是在同一文件和/或包中具有特定类的扩展名似乎很有意义。例如,String的扩展名可以在StringExtensions.kt中,也可以选择在扩展包中。

答案 2 :(得分:0)

是的,扩展函数可以在任何需要的地方声明。

对于通用工具的功能(关于列表),我应该将它们放在/company/app/util/lists.kt之类的地方。

答案 3 :(得分:0)

要使扩展成为全局扩展,您需要将其放在类之外

package com.extension.globalcontext

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

要调用它们,您需要导入软件包

import com.extension.globalcontext
l.swap(0, 2)