Swift实现:按传入类型过滤继承自基类的对象数组
实现泛型函数过滤指定子类对象
嘿,这事儿好办!咱们来一步步搞定这个泛型过滤函数,让它精准筛选出数组里指定子类的对象~
首先明确核心需求:遍历存放MyBaseClass子类对象的数组,把属于指定子类的对象挑出来。Swift里有几种实用的实现方式:
基础循环实现
如果习惯用for循环处理逻辑,可以这样写:
// 先假设你的全局/可访问数组是这个 var myArray: [MyBaseClass] = [SubclassA(), SubclassB(), SubclassA(), SubclassC(), SubclassD()] func myFilter<T: MyBaseClass>(objectType: T.Type) -> [MyBaseClass] { var filteredArray: [MyBaseClass] = [] for object in myArray { // 用`is`关键字检查对象是否属于指定子类类型 if object is T { filteredArray.append(object) } } return filteredArray }
高阶函数简化版
Swift的高阶函数能让代码更简洁,直接用filter一行搞定:
func myFilter<T: MyBaseClass>(objectType: T.Type) -> [MyBaseClass] { return myArray.filter { $0 is T } }
更实用的优化版本(返回子类数组)
上面的版本返回的是[MyBaseClass],后续使用可能还要做类型转换。如果想让函数直接返回指定子类的数组,用compactMap实现会更顺手:
func myFilter<T: MyBaseClass>(objectType: T.Type) -> [T] { // compactMap会自动过滤转换失败的对象,直接返回[T]类型数组 return myArray.compactMap { $0 as? T } }
调用这个优化版的时候,直接就能拿到子类类型的数组,不用再额外转换:
let onlySubclassAs = myFilter(objectType: SubclassA.self) // onlySubclassAs的类型是[SubclassA],直接就能调用SubclassA的专属方法!
内容的提问来源于stack exchange,提问作者SwiftedMind
相关产品推荐
相关产品推荐

