加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-14 02:27:53 所属栏目:百科 来源:网络整理
导读:我有一个协议,’VariousThings’,以及两个符合它的类,’ThingType1’和’ThingType2′.我把这两类类的一些对象放入一个包含’VariousThings’的数组中.我现在想要从该数组中取出所有类型为’ThingType2’的对象.我怎样才能做到这一点? 这是我到目前为止所拥
我有一个协议,’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()

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读