Chciałbym napisać rozszerzenie do tablicy która zawiera elementy, które są generyczne. Nie chodzi tylko o to, że ma to być rozszerzenie dla tablicy obiektów danego typu, ale też same obiekty tablicy mają być generyczne. Próbowałem napisać to mniej więcej tak:
class Observer<Type> {
private(set) weak var observer: AnyObject?
private(set) var listener: (_ value: Type) -> ()
init(observer: AnyObject, listener: @escaping (_ value: Type) -> ()) {
self.observer = observer
self.listener = listener
}
}
extension Collection<T> where Iterator.Element == Observer<T> {
func foo(value: Iterator.Type) {
forEach { $0.listener(value) }
}
}
No niestety to nie przechodzi. Później chciałbym móc używać tego w taki sposób:
let observers = [Observer<Int>]()
observers.forEach { $0.foo(4) }
Czy ktoś zna jakiś sposób w jaki mogę zdefiniować takie rozszerzenie?
EDIT:
Udało się to rozwiązać z pomocą stackoverflow. Poniżej przykład:
protocol Observing {
associatedtype T
var listener: (_ newValue: T) -> () { get }
}
class Observer<T>: Observing {
private(set) weak var observer: AnyObject?
private(set) var listener: (_ value: T) -> ()
init(observer: AnyObject, listener: @escaping (_ value: T) -> ()) {
self.observer = observer
self.listener = listener
}
}
extension Collection where Iterator.Element: Observing {
func foo(value: Iterator.Element.T) {
forEach { $0.listener(value) }
}
}
Można zamknąć.
Użytkownik Damian Dudycz edytował ten post 07 października 2016 - 17:49