您可以为此使用密钥路径,因为密钥路径不需要
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
,即使相同的值被分配多次、连续、次。