2017-12-06 14 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

制約がそのように動作しませんが。古い制約を削除して新しい制約をインストールする必要があります(定数プロパティは変更できますが、そのためにはinoutパラメータは必要ありません)。とにかくinoutパラメーターを使用するのは非常に良い理由があります。もしそれがあなたの望むものなら、関数が新しい制約を返すほうが良いでしょう。 – Paulw11

+0

はい、現時点では私のコードを実行し続けるために、私はあなたの提案通りにそれを行います。だから 'myConstraint = doSomething(myConstraint)'。私は変数を1つの行に2回使用するのは好きではありません。私はよりクリーンな方法を願っています。 – lukwuerz

+2

これは、副作用(inoutパラメーター)を使用する場合と比較して、よりクリーンな方法です。私が言ったように、既存の制約を削除する必要があります。新しい制約を追加する前に、既存の制約を削除する必要があります。既存の制約を参照していなければ、それを行うのは難しいでしょう。 – Paulw11

答えて

1

constraintパラメータを明示的にアンラップされたNSLayoutConstraintと宣言するだけで解決しました。

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

UPDATE

ここで私はそれを使用するプロジェクトです:https://github.com/truffls/compatible-layout-anchors-ios

関連する問題