簡體   English   中英

快速擴展通用對象數組

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM