2016-06-20 4 views
0

無関係のタイプに1つのプロトコルで結合する最善の方法は何ですか。新しい型を配列の要素型として使用するには?1つのプロトコルでのユニテインタイプ

FooとクラスBarは無関係です サードパーティが提供するクラスは、しかし、私はタイプFooBarの要素を含む配列を作成したいと思います。 FooBarの実装を直接変更することはできません。

一つのアプローチは、次のようになります。

protocol FooBar {} 
extension Foo: FooBar {} 
extension Bar: FooBar {} 

何の実装が存在しないので、これは、奇数とかなり魅力のないように私を打つ - 他の方法があるのですか?

この配列を列挙して、要素が処理されるのは、FooまたはBarのいずれかであることがわかっています。

+0

は 'Foo'と' Bar'は同じ基本クラスから継承することがありますか? – JAL

+0

@ JALいいえ、そうでなければ解決策は明らかです。 – ff10

+1

_ "FooとBarの要素タイプを含む配列を作成したい" _この配列をどのように使用する予定ですか? – courteouselk

答えて

1

ないあなたの質問に直接答えていますが、同じようenumを使用することができ、あなただけFoo Sを含む配列を反復処理したいことを考えるとBar S:

enum FooBar { 
    case WrappedFoo(Foo) 
    case WrappedBar(Bar) 
} 

これは、少なくともからあなたを救いますあなたが扱っている正確なタイプを得るためには、すべての要素を持つas?をしなければなりません。

例:

// Some setup 
var arr: [FooBar] = [] 

let foo = Foo() 
let bar = Bar() 

arr.append(.WrappedFoo(foo)) 
arr.append(.WrappedFoo(foo)) 
arr.append(.WrappedBar(bar)) 
arr.append(.WrappedFoo(foo)) 
arr.append(.WrappedBar(bar)) 
arr.append(.WrappedBar(bar)) 

// Enumeration 
arr.forEach { 
    switch $0 { 
    case .WrappedFoo(let foo): 
     // do something with `foo` 
    case .WrappedBar(let bar): 
     // do something with `bar` 
    } 
} 
関連する問題