2017-12-06 13 views
5

Tôi cố gán lại một tham chiếu NSLayoutConstraint.Không thể chuyển giá trị bất biến của loại 'NSLayoutConstraint' làm đối số 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) 
    } 
} 

Nhưng ở đây nó mang lại cho tôi những lỗi:

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

gì tôi không hiểu là tại sao nó nói giá trị bất biến, trong khi hạn chế được khai báo là một biến, không phải là một hằng số.

+0

hạn chế không làm việc như thế. Bạn cần phải loại bỏ ràng buộc cũ và cài đặt một ràng buộc mới (bạn có thể sửa đổi thuộc tính cố định nhưng bạn không cần một tham số inout cho điều đó). Bạn nên có một lý do rất tốt để sử dụng các tham số inout anyway. Nó là tốt hơn cho các chức năng để trở về một hạn chế mới nếu đó là những gì bạn muốn. – Paulw11

+0

có, hiện tại để giữ mã của tôi chạy, tôi thực hiện như bạn đề xuất. vì vậy 'myConstraint = doSomething (myConstraint)'. Tôi chỉ không thích sử dụng biến hai lần trong một dòng cho một điều. Tôi hy vọng cho một cách sạch hơn. – lukwuerz

+2

Đó là cách sạch hơn so với sử dụng hiệu ứng phụ (tham số inout). Như tôi đã nói, bạn cần loại bỏ ràng buộc hiện có trước khi bạn thêm một ràng buộc mới, nếu bạn không có tham chiếu đến ràng buộc hiện tại, sẽ rất khó để làm điều đó. – Paulw11

Trả lời

1

Tôi đã giải quyết nó bằng cách chỉ cần khai báo tham số constraint như một thông số chưa được mở một cách rõ ràng NSLayoutConstraint.

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

CẬP NHẬT

Đây là một dự án mà tôi sử dụng nó: https://github.com/truffls/compatible-layout-anchors-ios

Các vấn đề liên quan