Pull to refresh

Comments 2

Note: Заметьте, что используется не register, а register1. К сожалению, так необходимо указывать, если объект имеет в инициализаторе одну и только одну зависимость.

Эту проблему можно решить, используя в получаемой функции кортеж из n-элементов вместо n-аргументов.


func register<D, R>(_ factory: @escaping (D) throws -> R) {
    print("register 1")
}

func register<D1, D2, R>(_ factory: @escaping ((D1, D2)) throws -> R) {
    print("register 2")
}

func myFunc(arg1: String, arg2: String) -> String {
    return arg1 + arg2
}

register(myFunc)

register { (arg1: Int, arg2: Int) -> Int in
    return arg1 + arg2
}

Компилятор не будет ругаться на неоднозначность и будет выбирать корректную перегрузку.


Примеры использования этого приёма в других DI-фреймворках: 1, 2, 3

От автора библиотеки — большое спасибо за совет. Что-то я не подумал об этом. Правда на то есть причины — apple в 3 версии языка избавился от того что несколько параметров и картёж от нескольких параметров это одно и тоже. И в 3 версии это работало, а в 4 что-то снова поправили и сломали, но как-то частично…

Собственно говоря, надо убедиться что в 3 версии со старым Xcode данный код также работает.

И ещё раз спасибо — написать #if в крайнем случае на версию всегда можно.
Sign up to leave a comment.

Articles