是否只有在值不同的情况下才有标准的赋值运算符语法来分配值?

时间:2018-09-12 17:09:32

标签: swift operators variable-assignment

例如a =! bif a != b then { a = b }

在Swift中,即使设置了相同的值,也会设置一个属性。由于我正在使用领域通知,因此除非属性不同,否则我不想设置属性。我可以执行许多IF THEN语句,但我只想创建自己的赋值运算符即可使用。

编辑

我想我的问题是双重的,因为似乎inout将触发willSet/didSet个区块。

1)我的主要问题“是否存在仅用于值赋值的标准赋值运算符语法?”没有得到答案

2)Swift中有没有一种方法可以创建此运算符而不触发willSet/didSet?关键是不要触发领域通知。

1 个答案:

答案 0 :(得分:1)

您可以为此使用密钥路径,因为密钥路径不需要inout声明。

infix operator =!: AssignmentPrecedence

func =!<T, U: Equatable>(lhs: (T, ReferenceWritableKeyPath<T,U>), rhs: U) {
    if lhs.0[keyPath: lhs.1] != rhs {
       lhs.0[keyPath: lhs.1] = rhs
    }
}

func >><T, U: Equatable>(lhs: T, rhs: ReferenceWritableKeyPath<T,U>) -> (T, ReferenceWritableKeyPath<T,U>) {
    return (lhs, rhs)
}

上面的代码创建了您在问题中描述的运算符,还使>>重载以创建一个Object + KeyPath对,以将其传递给=!

用法将遵循以下几行:

class Person {
    var age: Int = 0 {
        didSet {
            print("New age:", age)
        }
    }
}

let person = Person()
person>>\.age =! 4
person>>\.age =! 4
person>>\.age =! 4
person>>\.age =! 5
person>>\.age =! 5

代码将按预期打印:

New age: 4
New age: 5

,即使同一值被连续多次分配。