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

Swift 5分割句子为单词、标点、空格数组的代码问题排查

需求说明
  • 目标:使用Swift 5通过编程方式将句子分割为独立元素,单词、包含空格在内的标点符号各自单独作为数组项
  • 输入示例:"Hello, I am Albert Einstein."
  • 期望输出:["Hello", ",", " ", "I", " ", "am", " ", "Albert", " ", "Einstein", "."]

基于参考代码修改后出现异常:空格没有成为独立数组元素,反而被拼接在后续单词元素的开头。

代码逻辑错误定位

修改后的代码存在两处核心逻辑问题,还有一处笔误:

  1. 边界判断缺失:现有逻辑仅覆盖了「正在拼接普通单词时遇到分隔符(标点/空格)」的场景,没有处理「正在缓存分隔符时遇到普通单词字符」「正在缓存分隔符时遇到另一个不同分隔符」的场景。比如遍历完逗号后缓存内容为,,后续遍历到空格、再遍历到字符I时,遇到I的分支逻辑直接将I拼接到缓存的空格后面,就会生成 I这种带前置空格的错误元素。
  2. 分隔符未即时存入结果:所有分隔符(空格、逗号、句号等)都需要作为独立元素存在,不能和其他字符拼接,现有逻辑没有在字符类型切换(普通词<->分隔符、分隔符<->分隔符)时第一时间把缓存的分隔符存入结果数组。
  3. 笔误:函数参数名为text_input,内部枚举字符时却调用了text.enumerateSubstrings,会直接触发编译错误。
修正后可运行代码
func sentenceSplitter(text_input: String) -> [String] {
    // 定义需要单独拆分的分隔符集合
    let separators = CharacterSet(charactersIn: " ,.;!?")
    var list = [String]()
    var currentSubString = ""
    
    text_input.enumerateSubstrings(in: text_input.startIndex..<text_input.endIndex, options: .byComposedCharacterSequences) { (substring, _, _, _) in
        guard let char = substring else { return }
        let isSeparator = char.unicodeScalars.allSatisfy { separators.contains($0) }
        
        if isSeparator {
            // 当前字符是分隔符,先把之前缓存的内容(单词/其他分隔符)存入数组
            if !currentSubString.isEmpty {
                list.append(currentSubString)
            }
            // 分隔符单字独立,直接作为新的缓存项
            currentSubString = char
        } else {
            // 当前字符是普通单词字符
            if !currentSubString.isEmpty {
                // 如果之前缓存的是分隔符,先存入数组再清空缓存
                let lastIsSeparator = currentSubString.unicodeScalars.allSatisfy { separators.contains($0) }
                if lastIsSeparator {
                    list.append(currentSubString)
                    currentSubString = ""
                }
            }
            // 拼接普通单词字符
            currentSubString += char
        }
    }
    
    // 存入最后一段缓存内容
    if !currentSubString.isEmpty {
        list.append(currentSubString)
    }
    
    return list
}

调用测试:

let testInput = "Hello, I am Albert Einstein."
let result = sentenceSplitter(text_input: testInput)
print(result)
// 输出: ["Hello", ",", " ", "I", " ", "am", " ", "Albert", " ", "Einstein", "."]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 01:54:35