Можем ли мы избежать дальнейшего уменьшения детализации Swift, как мы могли бы в Kotlin? - PullRequest
0 голосов
/ 16 марта 2020

В Kotlin мы могли бы создать функцию объема, как показано ниже.

    inline fun <R> run(block: () -> R): R {
        return block()
    }

Мы могли бы использовать ее, как показано ниже, для выбора вида для отображения.

    run {
        if (choice) viewOne else viewTwo
    }?.show()

В Swift , мы также можем объявить как показано ниже

    @inline(__always) func run<R>(block: () -> R) -> R {
        return block()
    }

Однако, когда мы используем его, оно должно быть действительно многословным, как показано ниже.

    run { () -> View? in     // Need to explicitly show `View is return
        if choice {
            return viewOne   // Need to explicitly return
        } else {
            return viewTwo   // Need to explicitly return
        }
    }?.show()

Есть ли где-нибудь, где мы могли бы уменьшить многословие Свифт, что я не в курсе, что выглядит более лаконично? (соответствует ближе к Kotlin)

ОБНОВЛЕНИЕ

Показать весь код

@inline(__always) func run<R>(block: () -> R) -> R {
    return block()
}

class View {
    func show() {print("A")}
}

let viewOne: View = View()
let viewTwo: View = View()

var choice = true

run { () -> View in
    return choice ? viewOne : viewTwo
}.show()

1 Ответ

1 голос
/ 16 марта 2020

Проблема в том, что компилятор не может определить тип возвращаемого многострочного замыкания. Однако вы можете легко сократить свое замыкание до одной строки, используя троичный оператор вместо if-else. Таким образом, вы можете избавиться как от операторов return, так и от аннотации типов.

run { choice ? viewOne : viewTwo }.show()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...