我有一个协议,’VarIoUsThings’,以及两个符合它的类,’ThingType1’和’ThingType2′.我把这两类类的一些对象放入一个包含’VarIoUsThings’的数组中.我现在想要从该数组中取出所有类型为’ThingType2’的对象.我怎样才能做到这一点?
这是我到目前为止所拥有的:
protocol VarIoUsThings: class { } class ThingType1: VarIoUsThings { } class ThingType2: VarIoUsThings { } let array: [VarIoUsThings] = [ThingType1(),ThingType2()] func itemsMatchingType(type: VarIoUsThings.Type) -> [VarIoUsThings] { return array.filter { varIoUsThing in return (varIoUsThing.self === type) } } let justThingTypes1: [VarIoUsThings] = itemsMatchingType(ThingType1)@H_404_4@
我会在这里使用flatMap而不是filter,以便为您提供更好的类型安全性.您可以使用条件向下转换来过滤掉所需的元素和泛型,以便保留类型信息.这利用了flatMap可以从转换函数中过滤掉nil结果的事实.
let array: [VarIoUsThings] = [ThingType1(),ThingType2()] func itemsMatchingType<T:VarIoUsThings>(_ type: T.Type) -> [T] { return array.flatMap {$0 as? T} } let justThingTypes1 = itemsMatchingType(ThingType1.self) // of type [ThingType1]@H_404_4@现在,如果传入ThingType1,那么从itemsMatchingType函数中获取的数组是[ThingType1],而不是简单地[VarIoUsThings].通过这种方式,您不必在以后处理丑陋的强迫性向下倾斜.
如果你真的想要花哨,你也可以删除type参数,让Swift通过显式类型注释推断出要过滤掉的类型:
func itemsMatchingType<T:VarIoUsThings>() -> [T] { return array.flatMap {$0 as? T} } let justThingTypes1 : [ThingType1] = itemsMatchingType()@H_404_4@
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。