[英]Extend Array of generic objects in swift
我想在 swift 中編寫對泛型類型數組的擴展。 這就是我嘗試這樣做的方式:
class Observer<Type> {
private(set) weak var observer: AnyObject?
private var listener: (_ newValue: Type) -> ()
init(observer: AnyObject, listener: @escaping (_ newValue: Type) -> ()) {
self.observer = observer
self.listener = listener
}
}
extension Collection where Iterator.Element == Observer<Type> {
func foo<Type>(value: Type) {
forEach { $0.listener(value) }
}
}
我希望能夠使用這種泛型類型的參數執行函數。 有沒有辦法編寫這樣的擴展? 后來這看起來像這樣:
let observers = [Observer<Int>]()
observers.forEach { $0.foo(4) }
您的示例與您的實現不匹配。 什么是foo
? 它與a
什么關系? 我將在這里猜測您的意思是:
extension Collection where Iterator.Element == Observer<Type> {
func foo<Type>(value: Type) {
forEach { $0.listener(value) }
}
}
然后后來:
let observers = [Observer<Int>]()
observers.foo(value: 4)
您不能將擴展附加到基於特定元素的集合。 這是對擴展的限制,與Observer
是否通用無關。 您不能在where
子句中使用==
。 但是您可以使用協議。
protocol Observing {
associatedtype ObservingType
var listener: (_ newValue: ObservingType) -> () { get }
}
然后將觀察者標記為觀察:
class Observer<ObservingType>: Observing {
private(set) weak var observer: AnyObject?
var listener: (_ newValue: ObservingType) -> ()
我做了另外兩個改變。 我將Type
換成ObservingType
因為Type
是一個關鍵字(所以有點混亂)。 此外,除非擴展名也是私有的,否則listener
器不能是私有的。
好的,鑒於:
extension Collection where Iterator.Element: Observing {
func foo(value: Iterator.Element.ObservingType) {
forEach { $0.listener(value) }
}
}
let observers = [Observer<Int>]()
observers.foo(value: 4)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.