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

使用Combine的.first(where:)时为何匹配结果为H而非预期的O?

问题根因

这个现象和Combine的.first(where:)算子逻辑无关,是字符串大小写严格匹配导致的判断偏差:

  • 参考字符串"Hello World"里的字母o是小写形式,而发布者发射的第二个值是大写"O",Swift的String.contains方法默认区分大小写,因此大写"O"会被判定为不满足匹配条件。
  • 发射序列里的第三个值是大写"H",和参考字符串首字符的大写"H"完全一致,满足匹配规则。.first(where:)在找到第一个符合条件的值后,会立刻向上游发送取消信号终止订阅,因此后续的"N"不会再被接收,完全符合算子的设计预期。
修正方案

如果需要忽略大小写做匹配,只需要在判断逻辑里统一两边字符串的大小写即可,参考代码如下:

// 1 创建发射四个字母的发布者
let publisher = ["J", "O", "H", "N"].publisher

// 2 统一大小写后执行匹配
publisher
    .print("publisher")
    .first(where: { "Hello World".lowercased().contains($0.lowercased()) })
    .sink(receiveValue: { print("First match is \($0)") })
    .store(in: &subscriptions)

修正后运行的控制台输出如下,会匹配到顺序更早的"O":

publisher: receive subscription: (["J", "O", "H", "N"]) 
publisher: request unlimited 
publisher: receive value: (J) 
publisher: receive value: (O) 
publisher: receive cancel 
First match is O

内容的提问来源于stack exchange,提问作者Amin Bagheri

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 03:57:19