无法转换 UILayoutPriority 类型的值

Cannot convert value of type UILayoutPriority

我正在尝试将一个约束的优先级更改为高于另一个约束的优先级。在 Swift 4 / iOS 11 中,此代码不再编译:

let p = self.lab2.contentCompressionResistancePriority(for:.horizontal)
self.lab1.setContentCompressionResistancePriority(p+1, for: .horizontal)

我该怎么做?

在Swift4 / iOS11中,UILayoutPriority不再是简单的数字;它是一个 RawRepresentable 结构。您必须通过结构的 rawValue 来计算。

手头有一个扩展程序可能会有用:

extension UILayoutPriority {
    static func +(lhs: UILayoutPriority, rhs: Float) -> UILayoutPriority {
        let raw = lhs.rawValue + rhs
        return UILayoutPriority(rawValue:raw)
    }
}

现在 + 运算符可用于将 UILayoutPriority 与数字组合,就像过去一样。您问题中的代码现在可以正确编译(并工作)。

EDIT 在 iOS 13 中不再需要此扩展,因为它已直接合并到系统中(另外您现在可以初始化 UILayoutPriority 而无需说 rawValue:).尽管如此,我仍然不明白为什么 Apple 曾经认为 priority 除了数字之外的任何东西都是一个好主意,因为这就是它的全部或需要的。

您可以执行以下操作以像以前一样继续使用它们:

import UIKit

// MARK: - Allow to pass a float value to the functions depending on UILayoutPriority
extension UILayoutPriority: ExpressibleByFloatLiteral {
    public typealias FloatLiteralType = Float

    public init(floatLiteral value: Float) {
        self.init(value)
    }
}

// MARK: - Allow to pass an integer value to the functions depending on UILayoutPriority
extension UILayoutPriority: ExpressibleByIntegerLiteral {
    public typealias IntegerLiteralType = Int

    public init(integerLiteral value: Int) {
        self.init(Float(value))
    }
}

请参阅 https://gist.github.com/jeremiegirault/7f73692a162b6ecf8ef60c7809e8679e 了解完整的实施方式