(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))
您必须使用临时变量来处理字符串。
完整错误:
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))
您必须使用临时变量来处理字符串。