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

Swift中与Python any/all函数最接近的等价实现是什么?

Swift中类似Python any() 和 all() 的实现方案

嘿,这个问题问得好!确实Swift标准库没有直接提供和Python里any()、all()完全对应的内置函数,但实现起来超级简洁,甚至可以利用Swift的高阶函数特性做得更灵活,完全满足你的需求。

先回顾下Python里这两个函数的逻辑:

  • any(iterable):只要可迭代对象里存在任意一个真值元素就返回True,否则返回False
  • all(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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 10:04:19