如何查找Swift项目中所有使用重写~=运算符的位置?
问题描述
我给String扩展重写了~=运算符,用来实现正则匹配:
extension String { static func ~= (lhs: String, rhs: String) -> Bool { guard let regex = try? NSRegularExpression(pattern: rhs) else { return false } let range = NSRange(location: 0, length: lhs.utf16.count) return regex.firstMatch(in: lhs, options: [], range: range) != nil } }
现在需要修改这个运算符的逻辑,但无法定位所有调用位置——包括switch-case中隐式调用的场景。Cmd+Ctrl+Shift+H快捷键无效,直接搜索~=会混入其他无关用法,手动筛选所有switch String的情况效率极低。如果遗漏调用处,会出现无编译警告的运行异常。
解决方案
临时重命名运算符触发编译错误
把扩展里的~=改成一个未使用的符号(比如~==),然后编译项目。Xcode会把所有调用该运算符的位置(包括switch里的隐式调用)标记为错误,直接跳转即可定位所有需要修改的地方。完成修改后再把符号改回~=。Xcode结构化精准查找
打开Xcode查找面板(Cmd+Shift+F),点击搜索框左侧放大镜,选择「Find > Find & Replace > Structured Find」,输入以下结构:switch $x { case $y: $z }点击搜索框右侧「Options」,设置类型筛选:将
$x的类型限定为String,$y的类型限定为String。这样就能精准筛选出所有符合条件的switch语句。SwiftSyntax批量分析代码
针对超大型项目,可以用SwiftSyntax写脚本遍历所有.swift文件,自动识别匹配String类型的switch-case:import SwiftSyntax import SwiftSyntaxParser func scanStringSwitchCases(at filePath: String) { let fileURL = URL(fileURLWithPath: filePath) guard let tree = try? SyntaxParser.parse(fileURL) else { return } tree.walk(SwitchCaseScanner()) } class SwitchCaseScanner: SyntaxVisitor { override func visit(_ node: SwitchStmtSyntax) -> SyntaxVisitorContinueKind { // 检查switch表达式是否为String类型 if let typeAnnotation = node.expression.typeAnnotation, let identifierType = typeAnnotation.type.as(IdentifierTypeSyntax.self), identifierType.name.text == "String" { // 遍历所有case,检查是否为String模式 for caseItem in node.caseItems { if caseItem.pattern.as(StringLiteralExprSyntax.self) != nil { print("\(node.position.lineNumber) - \(fileURL.path): 找到String switch-case") } } } return .visitChildren } } // 调用示例:遍历指定目录下的.swift文件 let projectDir = "/path/to/your/project" try FileManager.default.enumerator(atPath: projectDir)? .compactMap { $0 as? String } .filter { $0.hasSuffix(".swift") } .forEach { scanStringSwitchCases(at: "\(projectDir)/\($0)") }
内容的提问来源于stack exchange,提问作者Roman
相关产品推荐
相关产品推荐

