Статус | Ожидание | Реальность |
---|---|---|
Надеемся, что DSL в Kotlin-е превратится в DSL на Swift | Сгенерировались функции с receiver-ами, выглядит не так удобно, как хотелось бы |
В Kotlin-е есть возможность создать DSL на основе множества extension-функций, которые нужно передавать внутрь других функций. Для примера - DSL для UI-тестов.
@DslMarker
annotation class DslMarkerExample
interface Experiment {
val key: String
val description: String
}
@DslMarkerExample
class ExperimentsDsl {
val list = mutableListOf<Experiment>()
fun enable(experiment: Experiment) {
list += experiment
}
}
@DslMarkerExample
class Dsl {
val experiments = ExperimentsDsl()
fun experiments(block: ExperimentsDsl.() -> Unit = {}) {
experiments.block()
}
}
private fun example() {
Dsl().apply {
experiments {
enable(object : Experiment {
override val key: String get() = "key1"
override val description: String get() = "desc1"
})
}
}
}
Но при переходе в Swift extension-функции в аргументах превращаются в функции с параметрами, что выглядит не так, как хотелось бы:
dslBlock { dsl in
dsl.experiments { experimentsDsl in
experimentsDsl.enable(...)
}
}
private func dslBlock(block: (Dsl) -> Dsl) -> Dsl {
var dsl = Dsl()
dsl = block(dsl)
return dsl
}
В Swift-е можно статейка на Habr-е про DSL в Swift, а ещё есть github-репозиторий со списком Swift-библиотек, построенных на DSL.