使用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
相关产品推荐
相关产品推荐

