Kotlin Функция для класса - PullRequest
       7

Kotlin Функция для класса

0 голосов
/ 06 февраля 2020

Может кто-нибудь научить меня, как преобразовать функцию в класс? Я неоднократно использую функцию «Parse Query» () в моем проекте. мне было интересно, могу ли я преобразовать функцию в класс, чтобы я мог вызывать ее из любого места?

fun queryComment(postid: String, limit: Int, skip: Int, completion: (comment: ArrayList<CommentedUsers>) -> Unit) : ArrayList<CommentedUsers> {

        var countObject: Int
        var sampleArray = ArrayList<CommentedUsers>()
        val query = ParseQuery<ParseObject>("Comments")
        query.setLimit(limit)
        query.setSkip(skip)
        query.whereEqualTo("groupName", postid)
        query.addDescendingOrder("point")
        query.include("commenter")
        query.findInBackground { objects, e ->

            for (i in objects) {

               samplArray.add(i)

            }
            completion(sampleArray)

        }
        return sampleArray
    }

Если я допустил синтаксическую ошибку. не беспокойтесь об ошибке. я не копировал и не вставлял.

Ответы [ 4 ]

0 голосов
/ 07 февраля 2020

Если вы хотите sh передать ссылку на вашу функцию, вы можете использовать рефлексию. Чтобы упростить пример, представьте, что в следующем f это ваш queryComment, и мы хотим передать его ссылку:

fun f (x : Int) : String = (x+1).toString()

fun ff( x: Int, block : (Int) -> String) {
    println(block(x))
}


fun main() {
    ff(1, ::f) // prints: 2
}  
0 голосов
/ 06 февраля 2020

Есть две опции

  1. Создать функцию расширения [ Ссылка ]

Возможность функции расширения расширить класс с новой функциональностью без наследования от класса. Чтобы объявить функцию расширения, нам нужно добавить к ее имени тип получателя. Пример

    fun Context.showInfoDialog()
    {
       ....
    }

In your activity call showInfoDialog() fun
Создать класс и добавить в этот класс методы stati c . (сопутствующий объект в kotlin).
0 голосов
/ 06 февраля 2020

Обычно лучше поместить такую ​​функцию в объект-компаньон класса, как показано в другом ответе.

Но это не является строго необходимым; Вы также можете вызывать функцию верхнего уровня из любого места. Проще всего, если вы положите его в пакет:

package myPackage

fun myFunction(…) { … }

Тогда вы можете назвать его как:

myPackage.myFunction(…)

Или вы можете импортировать его:

import myPackage.myFunction

myFunction(…)

Кстати, обычно лучше возвращать тип интерфейса (например, List) вместо конкретного типа реализации (например, ArrayList), так как это позволяет вам изменить тип реализации, не изменяя остальную часть вашего кода. И вы можете избежать l oop, используя sampleArray.addAll(objects). (Могут быть способы вообще избежать копирования списка, но я не знаю, какую библиотеку ParseQuery вы используете.)

0 голосов
/ 06 февраля 2020

Вы можете использовать объект-компаньон для хранения метода, как показано здесь https://alexdunn.org/2018/01/30/android-kotlin-basics-static-classes/

Вместо использования метода create у вас может быть класс Query с queryComment метод внутри объекта-компаньона, чтобы вы могли вызывать его статически.

class Query() {
    companion object {
        fun queryComment (/*your arguments here*/): /*your result type here*/ {
           // your code here
        }
    }
}
...