Можем ли мы объявить что-то вроде T. <functionName>или T. () в Swift, как мы могли бы сделать в Kotlin? - PullRequest
0 голосов
/ 15 марта 2020

В Kotlin мы могли бы определить что-то, как показано ниже

inline fun <T> T.justApply(block: T.() -> Unit) {
    block()
}

С этим мы могли бы сделать что-то, как показано ниже

class TestingClass {
    fun printA() { print("A") }
    fun printB() { print("B") }
}

val a: TestingClass? = TestingClass()
a?.apply {
    printA()
    printB()
}

В Swift, наиболее близкий, который я нашел, мы могли сделать, это сделать структуру и отправить в качестве параметра в закрытие, потому что я не могу сделать это T.<something> и T.()

protocol ScopeFunc {}
extension ScopeFunc { // This is not nice, have to explicitly scope into an extension
    @inline(__always) func justApply(block: (Self) -> ()) {
        block(self)
    }
}

Затем, чтобы использовать его, мы ' Я буду нуждаться в явном наследовании от него

class TestingClass {
    func printA() { print("A") }
    func printB() { print("B") }
}

extension TestingClass: ScopeFunc {} // This is not nice, have to explicitly make it inherit

let a: TestingClass? = TestingClass()

a?.justApply {
    $0.printA() // This is not nice, need $0
    $0.printB()
}

Есть ли способ заставить swift вести себя так, как имеет Kotlin, возможность определить обобщенную функцию c для типа T и заставить ее вызывать любая функция Т, через T.()?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...