在大型 Swift 代码库中用“.do(onComplete: {})”系统地替换“.doOnComplete {}”的最简单方法是什么?

What is the easiest way to systematically replace ".doOnComplete {}" with ".do(onComplete: {})" in a large Swift codebase?

最好的替换方法是什么:

.doOnComplete {
    // Implementation
}

.do(
    onComplete: {
        // Implementation
    }
)

整个大型 Swift 代码库?鉴于有大量这些手动替换不是一个选项。

Xcode 中的查找和替换功能具有正则表达式选项。您应该能够制作一个正则表达式来执行此操作。

在 Xcode-菜单查找 > 在项目中查找和替换...(或者 ⌥⇧⌘F)。您到达了通常可以找到 Project Navigator 的地方,现在是 Find Navigator。在最上面 select 而不是 'Text' 'Regular Expression':

然后在第一个文本字段中键入(注意:如果您的块在花括号内包含更多花括号,我的方法不起作用)

( *)\.doOnComplete \{([^\}]*)\}

在它之后按输入。在第二个文本字段下方,应显示所有出现的 .doOnComplete 块。

现在您可以输入(每个'[enter]'表示control+q后跟[=​​26=]enter)

.do([enter]onComplete: {}[enter])

在第二个文本字段中。之后,您应该 select 在第二个文本字段下方找到的事件之一,然后按 'Replace' 按钮。如果替换没问题,block里的东西还在,你可以按'Replace All'按钮,整个工程里的东西都应该被替换了。

根据代码的复杂性,这可能很难实现。

正确的方法确实是尝试捕获实现块。但是,重要的是要注意平衡的花括号,例如像这样:

\.doOnComplete\s*(\{(?>[^{}]+|(?1))*\})

然后替换为

.do(\n\tonComplete: \t\n)

Demo

PS:我试着打印代码,但无论如何你都必须重新格式化代码。