-
Notifications
You must be signed in to change notification settings - Fork 10.4k
/
Copy pathissue-51181.swift
59 lines (46 loc) · 1.2 KB
/
issue-51181.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
// RUN: %target-run-simple-swift
// REQUIRES: executable_test
// https://github.com/apple/swift/issues/51181
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\")")