Files
swift-mirror/test/decl/var/didset_oldvalue.swift
2022-08-26 04:09:10 +03:00

62 lines
1.3 KiB
Swift

// RUN: %target-run-simple-swift | %FileCheck %s
// REQUIRES: executable_test
import Swift
// https://github.com/apple/swift/issues/53698
// Do not call the getter to fetch the oldValue when oldValue is not
// referenced in the body
@propertyWrapper
struct Delayed<Value> {
var wrappedValue: Value {
get {
guard let value = value else {
preconditionFailure("Property \(String(describing: self)) has not been set yet")
}
return value
}
set {
guard value == nil else {
preconditionFailure("Property \(String(describing: self)) has already been set")
}
value = newValue
}
}
var value: Value?
}
class Foo {
@Delayed var bar: Int {
// CHECK: Hello, world!
didSet { print("Hello, world!") }
}
}
let foo = Foo()
foo.bar = 1
// Call the getter to fetch the oldValue when oldValue is referenced in body
class AnotherFoo {
var bar: Int = 0 {
// CHECK: 0
didSet { print(oldValue) }
}
}
let anotherFoo = AnotherFoo()
anotherFoo.bar = 1
// Call the getter to fetch the oldValue when oldValue is explicitly specified
// as a parameter, but not used in the body.
class YetAnotherFoo {
var bar: Int = 0 {
// CHECK: World, hello!
didSet(oldValue) { print("World, hello!") }
}
}
let yetAnotherFoo = YetAnotherFoo()
yetAnotherFoo.bar = 1