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ố.
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
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
Đó 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