如何从父类数组中筛选出所有子类实例?
解决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
相关产品推荐
相关产品推荐

