在 Swift 中,我试图实现一种类似于 Ruby 中存在的方法“tap”的方法。
我想出了以下示例代码:
private protocol Tap {
mutating func tap(_ block: (inout Self) -> Void) -> Self
}
private extension Tap {
mutating func tap(_ block: (inout Self) -> Void) -> Self {
block(&self)
return self
}
}
extension Array: Tap {}
var a = Array(repeating: "Hello", count: 5)
a.tap {
$0.append("5")
}.tap {
$0.append("7")
}
print(a) // (Expected) => ["Hello", "Hello", "Hello", "Hello", "Hello", "5", "7"]
Run Code Online (Sandbox Code Playgroud)
我对变异函数、inout 参数或 Swift 不太熟悉,但上面的代码看起来应该对我有用。tap当它没有包含在方法链中时,它会按预期工作。当我将它作为方法链的一部分包含时(如上面的示例所示),Swift 编译器会抱怨:
无法对不可变值使用变异成员:函数调用返回不可变值
谁能向我解释为什么这不起作用?任何人都可以提供一个可行的解决方案并解释为什么该解决方案有效吗?