[英]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.