В моем проекте у меня есть такая функция:
fun doCoolStuff(arg1: Int = 0, arg2: String? = null) { }
Который я хочу, чтобы он использовал его в следующих случаях:
obj.doCoolStuff(101) // only first argument provided obj.doCoolStuff("102") // only second argument provided obj.doCoolStuff(103, "104") // both arguments provided
Но не в этом:
obj.doCoolStuff() // illegal case, should not be able to call the function like this
Как достичь этого на уровне синтаксиса?
В Котлине нет синтаксиса, который позволит вам выполнить то, что вам нужно. Используйте перегруженные функции (я бы использовал два, по одному для каждого требуемого аргумента):
fun doCoolStuff(arg1: Int, arg2: String? = null) { ... } fun doCoolStuff(arg2: String?) { doCoolStuff(defaultIntValue(), arg2) }
Это невозможно, потому что вы сделали оба аргумента опционными. Вы можете добавить проверку в тело метода или, что бы я предпочел, обеспечить надлежащие перегрузки :
fun doCoolStuff(arg1: Int) { doCoolStuff(arg1, null) } fun doCoolStuff(arg2: String?) { doCoolStuff(0, arg2) } fun doCoolStuff(arg1: Int, arg2: String?) {}
Может быть, я не понимаю, но это работает для меня
fun doCoolStuff() { throw IllegalArgumentException("Can't do this") }
Просто определите метод без параметров и исключите исключение.
Вы можете объявить doCoolStuff()
с нулевым параметром и пометить его как устаревшее с помощью параметра DeprecationLevel.ERROR
.
fun doCoolStuff(arg1: Int = 0, arg2: String? = null) {} @Deprecated("Should be called with at least one parameter", level = DeprecationLevel.ERROR) fun doCoolStuff() {}