如何用SwiftLint规则强制顶级类型使用指定PSO前缀?
SwiftLint自定义规则:强制顶级类型以PSO为前缀
要实现仅对顶级作用域的class、struct、enum、protocol强制PSO前缀,同时兼容各类修饰符(如private、@Model、final等),可以通过以下自定义规则解决:
custom_rules: pso_prefix_rule: name: "PSO Prefix Rule" regex: '^(?=(?:\n|.)*?(?:(?:\{[^}]*\})*[^{}]*$))\s*(?:(?:private|public|internal|fileprivate|@Model|@objc|final|open|@Observable|@MainActor)\s*)*\b(class|struct|enum|protocol)\s+(?!PSO)' message: "Top-level classes, structs, enums, and protocols should start with a 'PSO' prefix." severity: warning multiline: true
规则解析
括号平衡预查:
(?=(?:\n|.)*?(?:(?:\{[^}]*\})*[^{}]*$))
核心逻辑,通过正向预查统计从文件开头到当前行的{和}数量,确保两者平衡(无未闭合大括号),以此判断当前类型处于顶级作用域,避免匹配嵌套类型。修饰符兼容:
\s*(?:(?:private|public|internal|fileprivate|@Model|@objc|final|open|@Observable|@MainActor)\s*)*
匹配行首可选空白,以及任意数量的修饰符组合(可根据项目实际使用的修饰符补充列表),确保带修饰符的顶级类型能被正确匹配。类型关键字匹配:
\b(class|struct|enum|protocol)\s+
用单词边界\b确保匹配完整的类型关键字,避免误匹配包含这些关键字的其他字符串。前缀检查:
(?!PSO)
正向否定预查,确保类型名称不以PSO开头,触发规则警告。
验证示例
- ✅ 触发警告:
private class Test {}、@Model struct User {}、final enum Status {} - ❌ 不触发警告:
class PSOUser {}、protocol PSOProtocol {}、顶级类型内部嵌套的enum Inner {}
内容的提问来源于stack exchange,提问作者the Reverend
相关产品推荐
相关产品推荐

