2017-12-06 6 views
5

Ich versuche, eine Referenz NSLayoutConstraint neu zuzuweisen.Kann unveränderlichen Wert vom Typ 'NSLayoutConstraint' nicht als Argument übergeben

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

Aber hier gibt es mir die Fehlermeldung:

exchangeConstraint(&myConstraint) 
-------------------^ 
Cannot pass immutable value of type 'NSLayoutConstraint' as inout argument 

Was ich nicht verstehe, ist, warum es unveränderlich Wert sagt, während die Beschränkung als Variable deklariert wird, nicht eine Konstante.

+0

Einschränkungen wie das nicht funktionieren. Sie müssen die alte Einschränkung entfernen und eine neue installieren (Sie können die Konstante-Eigenschaft ändern, aber Sie benötigen dafür keinen inout-Parameter). Sie sollten trotzdem einen guten Grund haben, die Inout-Parameter zu verwenden. Es ist besser, wenn die Funktion eine neue Einschränkung zurückgibt, wenn dies gewünscht ist. – Paulw11

+0

Ja, momentan, um meinen Code laufen zu lassen, mache ich es so, wie Sie es vorschlagen. also 'myConstraint = doSomething (myConstraint)'. Ich mag es einfach nicht, die Variable zweimal in einer Zeile für eine Sache zu verwenden. Ich hoffe auf einen saubereren Weg. – lukwuerz

+2

Das ist der sauberere Weg im Vergleich zu einem Nebeneffekt (Inout-Parameter). Wie gesagt, Sie müssen die vorhandene Einschränkung trotzdem entfernen, bevor Sie eine neue hinzufügen, wenn Sie nicht den Verweis auf die bestehende Einschränkung haben, wird es schwierig sein, dies zu tun. – Paulw11

Antwort

Verwandte Themen