首页
/ SwiftFormat 中 MARK 注释后空白行规则的问题解析

SwiftFormat 中 MARK 注释后空白行规则的问题解析

2025-05-28 10:03:00作者:吴年前Myrtle

问题背景

在 Swift 代码格式化工具 SwiftFormat 的最新版本中,用户报告了一个关于 --lineaftermarks 规则的有趣问题。该规则本应在 // MARK: 注释后添加空白行,但在某些特定场景下却出现了异常行为。

问题现象

用户在使用 SwiftFormat 0.54.1 版本时发现,当 // MARK: 注释出现在链式方法调用中间时:

.navigationBarItems(trailing: SomeTrailingItem(...))
// MARK: Analytics
.onChange(of: yesSelected) { ... }

即使明确设置了 --lineaftermarks true,工具也不会在 MARK 注释后添加空白行。更令人困惑的是,当用户手动添加空白行后,SwiftFormat 反而会将其移除。

技术分析

经过深入分析,这个问题实际上是两个格式化规则之间的优先级冲突:

  1. blankLinesAroundMark 规则:负责在 MARK 注释周围添加空白行
  2. blankLinesBetweenChainedFunctions 规则:负责移除链式方法调用之间的空白行

在当前的实现中,blankLinesBetweenChainedFunctions 规则的优先级更高,它会覆盖 blankLinesAroundMark 的效果,导致 MARK 注释后的空白行被移除。

解决方案

项目维护者在 0.54.2 版本中修复了这个问题,调整了规则的优先级,确保 blankLinesAroundMark 规则能够正确生效。这意味着:

  • 现在 MARK 注释后的空白行会被保留
  • 即使出现在链式方法调用中,MARK 注释也能获得适当的空白间距

最佳实践建议

虽然技术问题已经解决,但从代码可读性角度考虑,开发者应当避免在链式方法调用中间插入 MARK 注释。MARK 注释更适合用于标记代码段落的开始,而不是插入到连续的方法链中。

正确的做法是将 MARK 注释放在方法链之前或之后:

// MARK: Analytics
.navigationBarItems(trailing: ...)
.onChange(of: ...) { ... }

这种写法不仅更符合 MARK 注释的设计初衷,也能避免潜在的格式化问题。

总结

这个案例展示了代码格式化工具中规则优先级的重要性,也提醒我们在使用 MARK 注释时要注意其位置和用途。SwiftFormat 通过不断优化规则处理逻辑,帮助开发者保持代码整洁一致。

登录后查看全文
热门项目推荐
相关项目推荐