数组 – 在Swift中如何根据类别过滤符合协议的对象数组?

发布时间:2020-03-03 发布网站:大佬教程
大佬教程收集整理的这篇文章主要介绍了数组 – 在Swift中如何根据类别过滤符合协议的对象数组?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个协议,’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)

解决方法

我会在这里使用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]

现在,如果传入ThingType1,那么从itemsMatchingType函数中获取的数组是[ThingType1],而不是简单地[VariousThings].通过这种方式,您不必在以后处理丑陋的强迫性向下倾斜.

如果你真的想要花哨,你也可以删除type参数,让Swift通过显式类型注释推断出要过滤掉的类型:

func itemsMatchingType<T:VariousThings>() -> [T] {
    return array.flatMap {$0 as? T}
}

let justThingTypes1 : [ThingType1] = itemsMatchingType()

大佬总结

以上是大佬教程为你收集整理的数组 – 在Swift中如何根据类别过滤符合协议的对象数组?全部内容,希望文章能够帮你解决数组 – 在Swift中如何根据类别过滤符合协议的对象数组?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ群:277859234,请注明来意。