blob: d8ad1c8cd57106c41d97569a3ca4d98105b27094 [file] [log] [blame]
// RUN: %target-run-simple-swift
// REQUIRES: executable_test
private protocol AnyChangeTracker {
var myVariable: Any? { get }
var isModified: Bool { get }
}
protocol ChangeTrackerType {
associatedtype Value
var originalValue: Value { get }
var value: Value { get set }
var isModified: Bool { get }
}
extension ChangeTrackerType where Value: Equatable {
var isModified: Bool {
return value != originalValue
}
}
struct ChangeTracker<T: Equatable>: ChangeTrackerType {
let originalValue: T
var value: T
init(value: T) {
originalValue = value
self.value = value
}
}
extension ChangeTracker: AnyChangeTracker where Value: OptionalType, Value.Wrapped: Equatable {
var myVariable: Any? {
return value
}
}
protocol OptionalType {
associatedtype Wrapped
var value: Wrapped? { get }
}
extension Optional: OptionalType {
var value: Wrapped? {
return self
}
}
let s: Any = ChangeTracker<String?>(value: "Foo")
guard let s = s as? AnyChangeTracker else {
fatalError("Does not comply to AnyChangeTracker")
}
let myVar = String(describing: s.myVariable ?? "nil")
assert(myVar == "Optional(\"Foo\")")