繁体   English   中英

在Swift中,如何按类别过滤符合协议的对象数组?

[英]In Swift how can I filter an array of objects conforming to a protocol by their class?

我有一个协议,'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)

我会在这里使用compactMap而不是filter ,以便为您提供更好的类型安全性。 您可以使用条件向下转换来过滤掉所需的元素和泛型,以便保留类型信息。 这利用了compactMap可以从转换函数中过滤掉nil结果的事实。

let array: [VariousThings] = [ThingType1(), ThingType2()]    

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

let justThingTypes1 = itemsMatchingType(ThingType1.self) // of type [ThingType1]

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

你可以使用泛型

func itemsMatchingType<T : VariousThings>(type: T.Type) -> [VariousThings] {
  return array.filter { $0 is T }
}

你可以使用filter

let justThingsTypes1 = array.filter { $0 is ThingType1 }
let justThingTypes1: [VariousThings] = array.filter {
  variousThing in
  return Mirror(reflecting: variousThing).subjectType == ThingType1.self
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM