Swift中能否用键路径表达式简化contains(where:)的样板代码?
Swift 键路径简化
contains(where:) 写法的方案 结论
完全可以实现你要的写法,不需要借助filter计数的方案,具体实现分两种情况:
1. 原生支持(Swift 5.7 及更高版本)
Swift 5.7 引入了键路径自动转换为匹配函数的特性,返回Bool类型的键路径可以直接作为contains(where:)的入参使用,你给出的示例可以直接简化为:
// 和原写法 `structs.contains { $0.bool }` 效果完全一致 let hasTruth = structs.contains(where: \.bool)
这种写法的性能远优于structs.filter(\.bool).count > 0:contains(where:)是短路遍历,找到第一个符合条件的元素就会立即停止遍历返回结果,不会像filter一样遍历整个数组、生成临时过滤数组再计算长度。
2. 低版本 Swift 兼容方案
如果你需要兼容 Swift 5.7 以下的版本,可以自行给Sequence添加扩展来实现这个能力:
extension Sequence { func contains(where keyPath: KeyPath<Element, Bool>) -> Bool { contains { $0[keyPath: keyPath] } } }
添加扩展后,即可在所有 Swift 版本中使用contains(where: \.bool)的简化写法。
内容的提问来源于stack exchange,提问作者Ilias Karim
相关产品推荐
相关产品推荐

