gpt4 book ai didi

arrays - 在 Swift 中,如何按类过滤符合协议(protocol)的对象数组?

转载 作者:搜寻专家 更新时间:2023-10-30 22:24:37 25 4
gpt4 key购买 nike

我有一个协议(protocol)“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],而不是简单的 [各种事物]。这样你就不必在以后处理丑陋的强制沮丧。

关于arrays - 在 Swift 中,如何按类过滤符合协议(protocol)的对象数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37857733/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com