Начну с небольших примеров кода, сделанных как можно проще, чтобы подвести итог этой проблеме.Как выполнить «необязательную разворачивание» функции с использованием общих параметров
Скажу, у меня есть функция, определенная следующим образом:
func doSomething<T>(using f: (String, (T) -> Void) -> Void, key: String) {
f("test", {
object in
// do something with object using key
//...
})
}
Я получил кучу автогенерируемых классов с методами класса для Exemple:
class MyClass {
var prop1: String = ""
}
class MyClassAPI {
class func f1(param: String, completion: (MyClass) -> Void) {
let mc = MyClass()
mc.prop1 = "hello"
completion(mc)
}
}
Затем я получил целый набор ключевых/функциональных пар в словаре:
// Any because of cast problem !
let keyFunctions: [String: Any] = [
"first" : MyClassAPI.f1,
"second" : MySecondClassAPI.f2,
"third" : MyThirdClassAPI.f3
//...
]
Наконец, я буду перебирать все ключи/f соборование позвонить doSomething
:
for (k, f) in keyFunctions {
// This line doesn't work as the compiler complain about typing errors
doSomething(using: f, key: k)
}
Проблема я столкнулся в том, что я не могу бросить свои функции на правильный тип, чтобы передать их doSomething
:
Xcode предполагают, чтобы заставить актеров с помощью f as! (String, (_) ->()) -> Void
затем дает я ошибка, _ не тип.
Я старался быть более разрешительным, используя if let uf = f as? (String, (Any) -> Void) -> Void
без каких-либо шансов.
Я прочитал все страницы дженериков руководства Swift без каких-либо намеков на то, как этого добиться.
Пожалуйста, дайте мне знать о любом существующем способе выполнения таких вещей с использованием универсальности.
Они называются более высокие kinded типы. Свифт их не поддерживает. – Alexander
Выполняют ли функции 'f1',' f2' и 'f3' в вашем словаре разные классы? Могут ли они хотя бы соответствовать одному протоколу? – Dmitry
@ Dimitry Нет, они не возвращаются из разных классов, на самом деле одним из их параметров является замыкание, причем каждый из них принимает другой тип в качестве параметра. Я думаю, что мне нужно будет привести их в соответствие с протоколом, спасибо – dulgan