2017-12-06 22 views
5

NSLayoutConstraint를 재 할당하려고합니다.'NSLayoutConstraint'유형의 불변 값을 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) 
    } 
} 

그러나 여기 나에게 오류를 제공합니다 : 그것은 불변의 값을 말한다 왜 제약 조건이 변수가 아닌 상수로 선언되는 반면

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

내가 뭘 이해하지 못하는 것은입니다.

+0

제약 그런 식으로 작동하지 않습니다

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

UPDATE 여기

내가 그것을 사용하는 프로젝트입니다. 이전 제약 조건을 제거하고 새 제약 조건을 설치해야합니다 (상수 속성을 수정할 수는 있지만 inout 매개 변수는 필요하지 않습니다). 어쨌든 inout 매개 변수를 사용하는 아주 좋은 이유가 있어야합니다. 그것이 원하는 경우 함수가 새 제한 조건을 반환하는 것이 더 좋습니다. – Paulw11

+0

예, 현재 제 코드를 계속 실행하는 것이 좋습니다. 그래서'myConstraint = doSomething (myConstraint)'. 한 줄에 두 번 변수를 사용하는 것을 좋아하지 않습니다. 나는 더 깨끗한 방법을 희망한다. – lukwuerz

+2

부작용 (inout 매개 변수)을 사용하는 것보다 더 깨끗한 방법입니다. 앞에서 말했듯이 새로운 제약 조건을 추가하기 전에 기존 제약 조건을 제거해야합니다. 기존 제약 조건에 대한 참조가 없다면 그렇게하기 어려울 것입니다. – Paulw11

답변