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 в крайнем случае на версию всегда можно.
Собственно говоря, надо убедиться что в 3 версии со старым Xcode данный код также работает.
И ещё раз спасибо — написать #if в крайнем случае на версию всегда можно.
Sign up to leave a comment.
Внедрение зависимостей с DITranquillity