Похоже, что закрытие совместимых параметров и возвращаемых типов невозможно выполнить (вверх или вниз). Я хочу хранить массивы обратных вызовов в словаре, где ключ может использоваться для определения типа параметра обратного вызова. Просто литье не будет делать:Закрытие литья в Свифт?
typealias AnyCallback = (value: AnyObject)-> Void
typealias SpecializedCallback = (value: UIView) -> Void
let callback : SpecializedCallback =
{
(value: UIView) in
println(value)
}
if let castCallback : AnyCallback = callback as? AnyCallback
{
// block never executed
println("did cast callback")
castCallback(value: self.view)
}
В качестве временного решения можно обернуть обратный вызов в общем классе, который будет обрабатывать тип параметров литья:
final class GenericCallback<T>
{
func executeCallback(value: Any?) -> Void
{
if let specificValue = value as? T
{
specificCallback(value: specificValue)
}
}
init(callback: (value: T?)->Void)
{
self.specificCallback = callback
}
private let specificCallback : (value: T?)->Void
}
Как executeCallback захватывает себя, он может быть добавлены непосредственно в массив обратных вызовов безопасно, устраняя необходимость сохранить ссылку на обертке:
typealias GenericCallbackType = (value: Any?) -> Void
var callbackArray : [ GenericCallbackType ] = []
let specializedCallback =
{
(value: UIView?) -> Void in
println(value)
}
let wrappedCallback = GenericCallback(callback: specializedCallback)
callbackArray.append(wrappedCallback.executeCallback)
Он отлично работает, но, конечно, я на рынке более простое решение должно есть один ...
Спасибо за ввод. Теперь я буду придерживаться своего оберточного решения ... – Gregzo