Swift中与Python any/all函数最接近的等价实现是什么?
Swift中类似Python
any() 和 all() 的实现方案 嘿,这个问题问得好!确实Swift标准库没有直接提供和Python里any()、all()完全对应的内置函数,但实现起来超级简洁,甚至可以利用Swift的高阶函数特性做得更灵活,完全满足你的需求。
先回顾下Python里这两个函数的逻辑:
any(iterable):只要可迭代对象里存在任意一个真值元素就返回True,否则返回Falseall(iterable):只有可迭代对象里所有元素都是真值才返回True,否则返回False
下面是几种在Swift里实现对应功能的方案:
基础等价实现
这两个函数可以直接用Swift的contains(where:)方法来实现,而且效率很高(遇到第一个符合条件的元素就会提前终止遍历):
实现 any() 功能
func any<T: Sequence>(_ sequence: T) -> Bool where T.Element: ExpressibleByBooleanLiteral { return sequence.contains(where: { $0 }) } // 调用测试 any([false, false, false]) // 返回 false any([false, false, true]) // 返回 true
实现 all() 功能
func all<T: Sequence>(_ sequence: T) -> Bool where T.Element: ExpressibleByBooleanLiteral { // 逻辑:只要找不到非真值元素,就说明全是真值 return !sequence.contains(where: { !$0 }) } // 调用测试 all([true, true, false]) // 返回 false all([true, true, true]) // 返回 true
如果你偏爱用reduce的方式(虽然遍历效率稍低,因为会走完所有元素),也可以这样写all():
func all<T: Sequence>(_ sequence: T) -> Bool where T.Element: ExpressibleByBooleanLiteral { return sequence.reduce(true, { $0 && $1 }) }
更灵活的自定义判断版本
有时候你可能需要自定义“什么是真值”(比如判断元素是否大于某个值,而不是直接用布尔值),可以扩展函数接受一个判断闭包,让功能更通用:
// 自定义判断的any版本 func any<T: Sequence>(_ sequence: T, isTruthy: (T.Element) -> Bool) -> Bool { return sequence.contains(where: isTruthy) } // 自定义判断的all版本 func all<T: Sequence>(_ sequence: T, isTruthy: (T.Element) -> Bool) -> Bool { return !sequence.contains(where: { !isTruthy($0) }) } // 示例用法 any([5, 8, 12], isTruthy: { $0 > 10 }) // 判断是否有大于10的元素 → 返回 true all([5, 8, 12], isTruthy: { $0 < 20 }) // 判断所有元素是否都小于20 → 返回 true
临时调用的简化写法
如果只是偶尔用一次,甚至不用专门定义函数,直接写一行代码就行:
// 临时实现any逻辑 [false, false, true].contains(where: { $0 }) // 结果:true // 临时实现all逻辑 ![true, true, false].contains(where: { !$0 }) // 结果:false
内容的提问来源于stack exchange,提问作者James Shapiro
相关产品推荐
相关产品推荐

