在一个协议下联合类型

时间:2016-06-20 13:14:29

标签: swift protocols

在一种协议下联合不相关类型的最佳方法是什么,例如将该新类型用作数组的元素类型?

e.g : 第三方提供的课程Foo和课程Bar不相关,但是,我想创建一个包含Foo {{}类型元素的数组1}}。请注意,我无法直接更改BarFoo的实施。

一种方法可能是:

Bar

然而,这让我觉得奇怪而且没有吸引力,因为没有实现 - 还有其他方法吗?

我将枚举该数组并处理元素,知道它可以是protocol FooBar {} extension Foo: FooBar {} extension Bar: FooBar {} Foo

1 个答案:

答案 0 :(得分:1)

不直接回答您的问题,但鉴于您只想迭代包含FooBar的数组,您可以使用enum,如:

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`
    }
}