代码之家  ›  专栏  ›  技术社区  ›  Tom Daniel

是否有标准的赋值运算符语法,仅当值不同时才赋值?

  •  -1
  • Tom Daniel  · 技术社区  · 6 年前

    例如。 a =! b if a != b then { a = b }

    在swift中,即使设置相同的值,也会设置属性。因为我使用的是领域通知,所以我不想设置属性,除非它是不同的。我可以做一组if-then语句,但我宁愿创建自己的赋值操作符来使用。

    编辑

    我想我的问题似乎是双重的 inout 将触发 willSet/didSet 阻碍。

    1)我的主要问题是‘有标准吗?’ 赋值运算符语法 只在值不同的情况下才赋值?没人接电话

    2)是否有一种快速创建此操作员而不触发 意志力/意志力 ?关键是不触发领域通知。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Cristik    6 年前

    您可以为此使用密钥路径,因为密钥路径不需要 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)
    }
    

    上面的代码创建了您在问题中描述的运算符,还重载了 >> 一个创建一个对象+键路径对传递给 =! .

    使用将沿着以下几行进行:

    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
    

    ,即使相同的值被分配多次、连续、次。