(Swift) 如何去掉 "Left side of mutating operator isn't mutable"

(Swift) How to get rid of "Left side of mutating operator isn't mutable"

完整错误:

Left side of mutating operator isn't mutable: 'abc' is a 'let' constant

发生这种情况是因为我试图更改由参数发送给函数的变量值。
我可以摆脱这个,还是找到其他解决方案?
代码(我的代码很复杂,但实际上是这样做的):

func generateABC() {
var abc = "this"
abc += "is"

let tapGesture = UITapGestureRecognizer(target: self, action: #selector(handleTap(abc)) )
tapGesture.delegate = self
webView.addGestureRecognizer(tapGesture)

abc += "function"
}

handleTap 函数:

@objc
func handleTap(_ someString: String) {   
     someString += "my"          
}

传递给 Swift 函数的所有参数都是常量,因此您无法更改它们。如果你愿意,你可以传入一个或多个参数作为inout,这意味着它们可以在你的函数内部改变,这些改变反映在函数外的原始值上。

func doubleInPlace(number: inout Int) {
    number *= 2
}

图片来源:Paul Hudson https://www.hackingwithswift.com/sixty/5/10/inout-parameters

使用这种方法时要小心,因为最终可能会产生意想不到的副作用。你也可以简单地在你的函数中使用一个临时变量,并将参数分配给它

@objc
func handleTap(_ someString: String)-> String {
     var tempString = someString   
     tempString += "Whatever" 
     return tempString         
}

您不能在函数内更改传递变量的值。如果你想改变 someString 的值,那么你必须将它存储到另一个变量中并像这样进一步使用它。

@objc
func handleTap(_ someString: String) {  
     var newString: String = someString 
     newString += "my"          
}

要使用 UITapGestureRecognizer 传递参数,一种方法是子类 UITapGestureRecognizer,然后设置 属性,如下例所示:

class SampleGesture: UITapGestureRecognizer {
    var someString = String()
}

class ViewController: UIViewController {

    let tapGesture = SampleGesture(target: self, action: #selector(self.handleTap))
    tapGesture.delegate = self
    webView.addGestureRecognizer(tapGesture)
    tapGesture.someString = //your text
}

至于其他人已经在回答中提到的错误 函数的参数默认为 'constants'

@objc func handleTap(sender: SampleGesture) {
     var newTitle: String = sender.someString   // you can declare as globally
     newTitle += "my"   
}

简短的故事:不可能将自定义参数添加到(任何)target/action

要么没有参数

@objc
func handleTap() { ...

或者受影响的识别器是参数

@objc
func handleTap(_ recognizer : UITapGestureRecognizer) { ...

就是这样。在这两种情况下,相应的声明都是

UITapGestureRecognizer(target: self, action: #selector(handleTap))

您必须使用临时变量来处理字符串。