I have a protocol, 'VariousThings', and two classes which conform to it, 'ThingType1' and 'ThingType2'. I've put some objects of these two types of classes into an array containing 'VariousThings'. I now want to just take all the objects out of that array that are of class type 'ThingType2' for example. How can I do this?
Here's what I have so far:
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)
You could use a generic
I would use
compactMap
instead offilter
here in order to give you better type safety. You can use a conditional downcast to filter out the elements you want and generics in order to preserve type information. This takes advantage of the fact thatcompactMap
can filter outnil
results from the transform function.Now the array you get out of your
itemsMatchingType
function is[ThingType1]
if you pass inThingType1
, rather than simply[VariousThings]
. That way you don't have to deal with ugly forced downcasts later down the line.You can use the
filter
for this: