Swift中带类型转换的enumerated()循环如何获取索引?
Swift中带类型转换的索引遍历实现方案
刚好你问到的这个场景,Swift其实提供了很优雅的写法来满足需求,这里给你两种常用的Swift风格实现方式:
方式一:直接在enumerated循环中结合模式匹配
你可以把类型转换的case let直接放到enumerated()返回的元组匹配里,这样就能同时拿到索引和类型转换后的元素,代码如下:
for (index, case let provider as ProviderModel) in providers.enumerated() { provider.activated = true // 这里可以直接使用index做任何需要的操作,比如打印索引:print("处理第\(index)个元素") }
这种写法的好处是直接在循环逻辑里完成类型过滤和索引获取,遇到数组中不是ProviderModel类型的元素会自动跳过,非常简洁。
方式二:先过滤再枚举索引
如果你需要先对数组做类型过滤,再基于过滤后的结果遍历(比如后续还要复用这个过滤后的数组),可以用compactMap先转换并过滤,再调用enumerated():
// 先把数组转换为仅包含ProviderModel的数组,再遍历索引和元素 for (index, provider) in providers.compactMap { $0 as? ProviderModel }.enumerated() { provider.activated = true }
compactMap会自动丢弃那些类型转换失败的元素,返回一个纯[ProviderModel]类型的数组,之后的enumerated()就能直接拿到对应的索引和元素了。
两种方式都很符合Swift的风格,你可以根据实际场景选择:如果只是单次遍历,第一种更直接;如果需要复用过滤后的数组,第二种更高效。
内容的提问来源于stack exchange,提问作者Vyacheslav
相关产品推荐
相关产品推荐

