Swift: закрытие с приемником, как эквивалент котлина? - PullRequest
1 голос
/ 07 апреля 2019

Здравствуйте, я хотел бы знать, есть ли эквивалент kotlin lambda с получателем в swift?

Как это:

fun <T> T.apply(block: T.() -> Unit): T

T.() есть эквивалент этогопрактиковаться в Свифте?

1 Ответ

2 голосов
/ 07 апреля 2019

Я не знаком с лямбдой Kotlin с приемником , но насколько я читаю документы Kotlin,

  • В Swift нет прямого эквивалента
  • Та же функциональность может быть достигнута добавлением параметра или карри

Но в Swift вы не можете определить функцию расширения для универсального T, где T - любой тип. Итак, что-то вроде вашего T.apply должно быть глобальной функцией с двумя аргументами.

С каррингом apply в Swift будет выглядеть примерно так:

func apply<T>(_ this: T, block: (T)->()->T) -> T {
    return block(this)()
}

Вы можете использовать это так:

var result = apply("Abc") {this in {this.uppercased()+this.lowercased()}}
print(result) //->ABCabc
...