You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:05:12