Suppress setting the same value on object

This commit is contained in:
Wojciech Nagrodzki 2021-06-03 20:08:38 +02:00
parent 677cf799f1
commit fa7a280f0e
Signed by: wnagrodzki
GPG key ID: E9D0EB0302264569
2 changed files with 37 additions and 4 deletions

View file

@ -63,17 +63,28 @@ public class UIVariation<Object: AnyObject, Value>: NSObject {
extension UIVariation: UIVariationApplying {
func applyIfMatchesTraitEnvironment() {
guard doesMatchTraitEnvironment() else { return }
object[keyPath: property] = value
}
func applyIfMatchesTraitEnvironment() where Value: Equatable {
guard doesMatchTraitEnvironment() else { return }
guard object[keyPath: property] != value else { return }
object[keyPath: property] = value
}
private func doesMatchTraitEnvironment() -> Bool {
guard let traitCollection = traitEnvironment?.traitCollection else {
print("Missing traitEnvironment when trying to apply \(self)")
return
return false
}
if let horizontalSizeClass = horizontalSizeClass {
if traitCollection.horizontalSizeClass != horizontalSizeClass { return }
if traitCollection.horizontalSizeClass != horizontalSizeClass { return false }
}
if let verticalSizeClass = verticalSizeClass {
if traitCollection.verticalSizeClass != verticalSizeClass { return }
if traitCollection.verticalSizeClass != verticalSizeClass { return false }
}
object[keyPath: property] = value
return true
}
}

View file

@ -85,6 +85,20 @@ final class UIVariationTests: XCTestCase {
XCTAssertNotEqual(label.text, sut.value)
}
func test_When_object_value_is_already_equal_to_variation_value_Then_variation_is_NOT_applied() {
let object = Object()
let sut = UIVariation(object: object,
keyPath: \.text,
value: valueWhenCompact,
horizontalSizeClass: .compact,
verticalSizeClass: nil)
traitEnvironment.traitCollection = UITraitCollection(horizontalSizeClass: .compact)
sut.traitEnvironment = traitEnvironment
sut.applyIfMatchesTraitEnvironment()
sut.applyIfMatchesTraitEnvironment()
XCTAssertEqual(object.setCount, 1)
}
func test_factory_method_for_sizeClassDimension_horizontal() {
let variations = UIVariation.make(for: label,
property: \.text,
@ -134,3 +148,11 @@ class TraitEnvironmentStub: NSObject, UITraitEnvironment {
}
}
class Object {
var text: String? {
didSet { setCount += 1 }
}
var setCount = 0
}