例如a =! b
是if a != b then { a = b }
在Swift中,即使设置了相同的值,也会设置一个属性。由于我正在使用领域通知,因此除非属性不同,否则我不想设置属性。我可以执行许多IF THEN语句,但我只想创建自己的赋值运算符即可使用。
编辑
我想我的问题是双重的,因为似乎inout
将触发willSet/didSet
个区块。
1)我的主要问题“是否存在仅用于值赋值的标准赋值运算符语法?”没有得到答案
2)Swift中有没有一种方法可以创建此运算符而不触发willSet/didSet
?关键是不要触发领域通知。
答案 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
,即使同一值被连续多次分配。