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

Swift中Scanner类的scanUpToString方法是否存在Bug?

问题解答:Scanner的scanUpToString并非Bug,是默认行为导致

这不是Bug,问题出在Swift的Scanner类默认会自动跳过空白字符。

原因分析

Scanner初始化时,charactersToBeSkipped属性默认包含所有空白字符(空格、换行符、制表符等)。你的代码里第一次调用scanUpToString("&")时,开头的空格被自动跳过,所以获取到的beforeString是"testing"而非预期的" testing",最终拼接出来的结果就少了开头的空格。

修复方案

只需要将Scanner的charactersToBeSkipped设为nil,关闭自动跳过空白字符的默认行为即可:

let testString = " testing & testing1&testing2"
let scanner = Scanner(string: testString)
scanner.charactersToBeSkipped = nil // 关键修改:关闭自动跳过空白
var resultString: String = ""

while scanner.isAtEnd == false {
    if let beforeString = scanner.scanUpToString("&") {
        resultString += beforeString
    }
    
    guard scanner.isAtEnd == false else {
        break
    }
    
    if let scanResult = scanner.scanString("&") {
        resultString += "&"
    }
}

验证结果

修改后,Scanner会保留所有原字符:

  1. 第一次scanUpToString("&")会获取到" testing "(开头的空格+testing+&前的空格)
  2. 扫描到&后替换为&
  3. 后续逻辑会正确处理testing1&testing2部分,最终得到预期的" testing & testing1&testing2"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 02:42:36