2016-10-07 5 views
2

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

あなたの例は実装と一致しません。 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) ->() 

私は2つの他の変更を加えました。 TypeObservingTypeに交換したのは、Typeがキーワードであるためです(少し混乱します)。また、listenerは、内線番号もプライベートでない限りプライベートにすることはできません。修正 - あなたは右の()は()FOOをすると仮定している

extension Collection where Iterator.Element: Observing { 
    func foo(value: Iterator.Element.ObservingType) { 
     forEach { $0.listener(value) } 
    } 
} 

let observers = [Observer<Int>]() 
observers.foo(value: 4) 
+0

:ことを考えればOK

、。 それは、associatedtypeとプロトコルを使って私が必要としていたものです。ありがとうございました。 –

関連する問題