在swift中扩展通用对象数组

时间:2016-10-07 15:57:57

标签: swift generics

我想在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) }

1 个答案:

答案 0 :(得分:1)

您的示例与您的实施不匹配。什么是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)