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

Swift中AttributedString渲染Markdown无序列表及缩进的实现问题

解决AttributedString渲染无序列表的类型不兼容问题

核心问题原因

output[intentRange]返回的是AttributedSubstring类型,而"⏺️" + output[intentRange]生成的是AttributedString类型,两者无法直接赋值,这就是报错的根本原因。正确的做法是通过替换整个范围的内容来实现,同时保留原文本的属性,再添加项目符号和缩进样式。

修正后的代码实现

替换原.unorderedList分支的代码,改为以下逻辑:

case .unorderedList:
    // 1. 将原子串转为AttributedString,保留原有属性
    let originalContent = AttributedString(output[intentRange])
    // 2. 创建带项目符号的新内容(可自定义符号)
    let bulletPoint = AttributedString("⏺️ ")
    // 3. 合并项目符号与原内容
    let newContent = bulletPoint + originalContent
    
    // 4. 设置缩进样式(处理多级列表可根据intent深度调整)
    var paragraphStyle = NSMutableParagraphStyle()
    // 首行缩进为负(抵消项目符号宽度),整体缩进对应层级
    paragraphStyle.headIndent = 24 // 整体缩进宽度
    paragraphStyle.firstLineHeadIndent = -12 // 首行反向缩进,对齐项目符号
    
    // 5. 给新内容应用段落样式
    var styledContent = newContent
    styledContent.paragraphStyle = paragraphStyle
    
    // 6. 替换原范围的内容
    output.replaceSubrange(intentRange, with: styledContent)

补充说明

  1. 多级列表处理:如果需要支持嵌套无序列表,可以通过intent.depth获取层级,动态调整headIndent和firstLineHeadIndent的值,比如每加深一级增加12pt缩进。
  2. 待办事项扩展:若要处理- [ ]或- [x]的待办样式,可以先解析原文本的前缀,替换为复选框符号(如☐或☑),再应用对应样式。
  3. 符号样式统一:可以给项目符号单独设置字体或颜色,比如:
    var bulletPoint = AttributedString("⏺️ ")
    bulletPoint.foregroundColor = .secondary
    bulletPoint.font = .custom(fontName, size: baseSize)
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 16:49:51