在一种协议下联合不相关类型的最佳方法是什么,例如将该新类型用作数组的元素类型?
e.g :
第三方提供的课程Foo
和课程Bar
不相关,但是,我想创建一个包含Foo
和 {{}类型元素的数组1}}。请注意,我无法直接更改Bar
和Foo
的实施。
一种方法可能是:
Bar
然而,这让我觉得奇怪而且没有吸引力,因为没有实现 - 还有其他方法吗?
我将枚举该数组并处理元素,知道它可以是protocol FooBar {}
extension Foo: FooBar {}
extension Bar: FooBar {}
或Foo
。
答案 0 :(得分:1)
不直接回答您的问题,但鉴于您只想迭代包含Foo
和Bar
的数组,您可以使用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`
}
}