2017-12-06 213 views
5

olarak değiştirilemedi. Referans URL'si NSLayoutConstraint'i yeniden atamaya çalışıyorum.'NSLayoutConstraint' türünün değişmez değeri inout argümanı

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

Ama burada bana hata verir: o değişmez değer diyor neden kısıt bir değişken değil, sabit olarak ilan oysa

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

Ne anlamıyorum vardır.

+0

Kısıtlamaları böyle çalışmaz:

func exchangeConstraint(_ constraint: inout NSLayoutConstraint!) { ... } 

GÜNCELLEME İşte

Bunu kullanmak bir projedir. Eski kısıtlamayı kaldırmanız ve yeni bir tane yüklemeniz gerekir (sabit özelliği değiştirebilir, ancak bunun için bir inout parametresine ihtiyacınız yoktur). Zaten inout parametrelerini kullanmak için çok iyi bir nedeniniz olmalı. İstediğiniz şey buysa, fonksiyonun yeni bir kısıtlama getirmesi daha iyidir. – Paulw11

+0

evet, şu anda kodumu çalışır durumda tutmak için önerdiğinizi yapıyorum. bu yüzden myConstraint = doSomething (myConstraint). Tek bir şey için değişkeni iki kez bir satırda kullanmayı sevmiyorum. Umarım daha temiz bir yoldur. – lukwuerz

+2

Bu, bir yan etki kullanıldıkça daha temiz bir yoldur (inout parametresi). Söylediğim gibi, yeni bir tane eklemeden önce varolan kısıtlamayı kaldırmanız gerekir, eğer mevcut kısıtlama referansı yoksa, bunu yapmak zor olacaktır. – Paulw11

cevap