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

如何从父类数组中筛选出所有子类实例?

解决Swift中从父类数组筛选子类实例的问题

这问题我之前写代码时也踩过坑~你当前的写法有两个关键问题:

  • $0 as B是强制向下转型,如果遇到不是B类型的实例,运行时会直接崩溃;
  • filter的闭包要求返回Bool类型来判断是否保留元素,但你这里写的是转型操作,类型不匹配,所以编译器直接报错了。

下面给你两种靠谱的解决方案,其中第二种是Swift里最推荐的写法:

方案1:先过滤类型再强制转换

先用filter结合is关键字筛选出所有属于B类型的实例,再用map做强制转换(因为已经过滤过,这里的as!是绝对安全的):

class A {} 
class B: A {} 

let arr: [A] = [A(), B()] 
let arrOfBs: [B] = arr.filter { $0 is B }.map { $0 as! B }

方案2:用compactMap一步到位(推荐)

compactMap会自动处理转型失败的情况——把非B的实例转换成nil后直接过滤掉,最终直接得到非可选的[B]数组,代码更简洁安全:

class A {} 
class B: A {} 

let arr: [A] = [A(), B()] 
let arrOfBs: [B] = arr.compactMap { $0 as? B }

简单总结下:as?用于安全的向下转型,失败时返回nil;而compactMap刚好可以把这些nil过滤掉,完美适配你的需求~

内容的提问来源于stack exchange,提问作者J. Doe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:09:39