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)
补充说明
- 多级列表处理:如果需要支持嵌套无序列表,可以通过
intent.depth获取层级,动态调整headIndent和firstLineHeadIndent的值,比如每加深一级增加12pt缩进。 - 待办事项扩展:若要处理
- [ ]或- [x]的待办样式,可以先解析原文本的前缀,替换为复选框符号(如☐或☑),再应用对应样式。 - 符号样式统一:可以给项目符号单独设置字体或颜色,比如:
var bulletPoint = AttributedString("⏺️ ") bulletPoint.foregroundColor = .secondary bulletPoint.font = .custom(fontName, size: baseSize)
内容的提问来源于stack exchange,提问作者appfrosch
相关产品推荐
相关产品推荐

