2017-12-06 152 views
5

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.

+0

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

+0

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

+2

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

Odpowiedz