微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

数组 – 在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)@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] 举报,一经查实,本站将立刻删除。

相关推荐