2015-04-08 3 views
3

Похоже, что закрытие совместимых параметров и возвращаемых типов невозможно выполнить (вверх или вниз). Я хочу хранить массивы обратных вызовов в словаре, где ключ может использоваться для определения типа параметра обратного вызова. Просто литье не будет делать:Закрытие литья в Свифт?

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) 

Он отлично работает, но, конечно, я на рынке более простое решение должно есть один ...

ответ

5

То, что вы пытаетесь сделать, не может быть выполнено в Swift (прямо сейчас).

Это как вы пытаетесь бросить объект Dog к объекту Cat, которые имеют следующую реализацию:

class Cat { 
    var value: UIView! 
} 

class Dog { 
    var value: AnyObject! 
} 

Я надеюсь, что это происходит в будущей версии Swift.

+0

Спасибо за ввод. Теперь я буду придерживаться своего оберточного решения ... – Gregzo

Смежные вопросы