(Swift) Как избавиться от «Левая сторона оператора мутации не изменяема» - PullRequest
0 голосов
/ 17 февраля 2020

полная ошибка:

Левая часть оператора мутации не изменяема: 'ab c' - это константа 'let'

Бывает, потому что я пытаясь изменить значение переменной, передаваемой параметром в функцию.
Могу ли я избавиться от этого или найти какое-то другое решение?
Код (Мой код очень сложный, но фактически делает то же самое, что и это):

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"          
}

Ответы [ 4 ]

5 голосов
/ 17 февраля 2020

Краткая история: Невозможно добавить пользовательские параметры в (любой) target/action

Либо нет параметра

@objc
func handleTap() { ...

, либо затронутый распознаватель является параметром

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

Вот и все. В обоих случаях соответствующее объявление:

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

. Для обработки строки необходимо использовать временную переменную.

1 голос
/ 17 февраля 2020

Для передачи параметров с использованием 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
}

А что касается ошибки, которую другие уже сказали в ответах, что Параметры функции по умолчанию являются «константами»

@objc func handleTap(sender: SampleGesture) {
     var newTitle: String = sender.someString   // you can declare as globally
     newTitle += "my"   
}
0 голосов
/ 17 февраля 2020

Вы не можете изменить значение прошедшей переменной внутри функции. Если вы хотите изменить значение someString, вам нужно сохранить его в другой переменной и использовать его далее, как это.

@objc
func handleTap(_ someString: String) {  
     var newString: String = someString 
     newString += "my"          
}
0 голосов
/ 17 февраля 2020

Все параметры, передаваемые в функцию Swift, являются константами, поэтому их нельзя изменить. Если вы хотите, вы можете передать один или несколько параметров как inout, что означает, что они могут быть изменены внутри вашей функции, и эти изменения отражаются в исходном значении за пределами функции.

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

Кредит: Пол Хадсон https://www.hackingwithswift.com/sixty/5/10/inout-parameters

Будьте осторожны, если вы идете с этим подходом, потому что вы можете получить неожиданные побочные эффекты. Вы также можете просто использовать временную переменную внутри своей функции и назначить ей параметр

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