如何扩展 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 行存在编译时错误,但这可能只是相同的错误传播。