Próbuję ponownie przydzielić odwołanie NSLayoutConstraint.Nie można przekazać niezmiennej wartości typu "NSLayoutConstraint" jako argumentu Inout
class ViewController: UIViewController {
@IBOutlet weak var myConstraint: NSLayoutConstraint!
override func viewDidLoad() {
super.viewDidLoad()
exchangeConstraint(&myConstraint)
}
}
extension UIViewController {
func exchangeConstraint(_ constraint: inout NSLayoutConstraint) {
let spacing = constraint.constant
view.removeConstraint(constraint)
constraint = view.topAnchor.constraint(equalTo: anotherView.topAnchor, constant: spacing)
view.addConstraint(constraint)
}
}
Ale tutaj to daje mi błąd:
exchangeConstraint(&myConstraint)
-------------------^
Cannot pass immutable value of type 'NSLayoutConstraint' as inout argument
czego nie rozumiem, dlaczego to mówi wartości niezmienne, podczas gdy ograniczenie jest zadeklarowana jako zmienna, a nie stały.
Ograniczenia nie działają w taki sposób. Musisz usunąć stare ograniczenie i zainstalować nowe (możesz zmodyfikować stałą właściwość, ale nie potrzebujesz do tego parametru inout). Powinieneś mieć dobry powód, aby mimo wszystko używać parametrów inout. Lepiej, aby funkcja zwróciła nowe ograniczenie, jeśli tego chcesz. – Paulw11
Tak, obecnie, aby mój kod działał, robię to, co sugerujesz. więc 'myConstraint = doSomething (myConstraint)'. Po prostu nie lubię używać zmiennej dwa razy w jednym wierszu. Mam nadzieję na czystszy sposób. – lukwuerz
To jest czystszy sposób w porównaniu do używania efektu ubocznego (parametr inout). Jak już powiedziałem, musisz usunąć istniejące ograniczenie, zanim dodasz nowe, jeśli nie masz odniesienia do istniejącego ograniczenia, trudno będzie to zrobić. – Paulw11