这是我到目前为止所拥有的:
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)我会在这里使用flatMap而不是filter,以便为您提供更好的类型安全性.您可以使用条件向下转换来过滤掉所需的元素和泛型,以便保留类型信息.这利用了flatMap可以从转换函数中过滤掉nil结果的事实.
let array: [VarIoUsThings] = [ThingType1(),ThingType2()] func itemsMatchingType<T:VarIoUsThings>(_ type: T.Type) -> [T] { return array.flatMap {func itemsMatchingType<T:VarIoUsThings>() -> [T] { return array.flatMap { as? T}}let justThingTypes1 : [ThingType1] = itemsMatchingType()as? T}}let justThingTypes1 = itemsMatchingType(ThingType1.self) // of type [ThingType1]
现在,如果传入ThingType1,那么从itemsMatchingType函数中获取的数组是[ThingType1],而不是简单地[VarIoUsThings].通过这种方式,您不必在以后处理丑陋的强迫性向下倾斜.
如果你真的想要花哨,你也可以删除type参数,让Swift通过显式类型注释推断出要过滤掉的类型:
总结以上是内存溢出为你收集整理的数组 – 在Swift中如何根据类别过滤符合协议的对象数组?全部内容,希望文章能够帮你解决数组 – 在Swift中如何根据类别过滤符合协议的对象数组?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)