【发布时间】:2015-10-13 20:33:26
【问题描述】:
如何扩展 swift 数组以访问特定类型的成员?
如果数组包含从同一个超类继承的多个类的实例,则这是相关的。理想情况下,它会适当地执行类型检查。
一些不太奏效的想法和事情:
使用filter(_:) 方法可以正常工作,但会强制执行类型安全。例如:
protocol MyProtocol { }
struct TypeA: MyProtocol { }
struct TypeB: MyProtocol { }
let myStructs:[MyProtocol] = [ TypeA(), TypeA(), TypeB() ]
let filteredArray = myStructs.filter({ $0 is TypeA })
filteredArray 包含正确的值,但类型仍然是 [MyProtocol] 而不是 [TypeA]。我希望用let filteredArray = myStructs.filter({ $0 is TypeA }) as! [TypeA] 替换最后一个可以解决这个问题,但是该项目以EXEC_BAD_INSTRUCTION 失败,我不明白。也许类型转换数组是不可能的?
理想情况下,这种行为可以包含在数组扩展中。以下内容无法编译:
extension Array {
func objectsOfType<T:Element>(type:T.Type) -> [T] {
return filter { $0 is T } as! [T]
}
}
这里似乎至少存在两个问题:类型约束T:Element 似乎不起作用。我不确定基于泛型类型添加约束的正确方法是什么。我的意思是说T 是Element 的子类型。此外,第 3 行存在编译时错误,但这可能只是相同的错误传播。
【问题讨论】:
标签: arrays swift generics swift-extensions