Skip to content

Commit 6a493bf

Browse files
Add Observer type as workaround for Swift bug SR-12294 (#46)
* Use Xcode 12.5.1 * Add Observer type as workaround for Swift bug SR-12294
1 parent 046c810 commit 6a493bf

File tree

1 file changed

+14
-7
lines changed

1 file changed

+14
-7
lines changed

Swift/Sources/StateMachine/StateMachine.swift

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,13 @@ open class StateMachine<State: StateMachineHashable, Event: StateMachineHashable
2727
public struct Invalid: Error, Equatable {}
2828
}
2929

30+
private struct Observer {
31+
32+
weak var object: AnyObject?
33+
34+
let callback: Transition.Callback
35+
}
36+
3037
public typealias Definition = StateMachineTypes.Definition<State, Event, SideEffect>
3138

3239
private typealias DefinitionBuilder = StateMachineTypes.DefinitionBuilder
@@ -42,7 +49,7 @@ open class StateMachine<State: StateMachineHashable, Event: StateMachineHashable
4249
public private(set) var state: State
4350

4451
private let states: States
45-
private var observers: [(object: () -> AnyObject?, callback: Transition.Callback)] = []
52+
private var observers: [Observer] = []
4653

4754
public init(@DefinitionBuilder build: () -> Definition) {
4855
let definition: Definition = build()
@@ -52,16 +59,16 @@ open class StateMachine<State: StateMachineHashable, Event: StateMachineHashable
5259
$0[$1.event] = $1.action
5360
}
5461
}
55-
observers = definition.callbacks.map { [unowned self] in
56-
(object: { self }, callback: $0)
62+
observers = definition.callbacks.map {
63+
Observer(object: self, callback: $0)
5764
}
5865
}
5966

6067
@discardableResult
6168
public func startObserving(_ observer: AnyObject?, callback: @escaping Transition.Callback) -> Self {
6269
guard let observer: AnyObject = observer
6370
else { return self }
64-
observers.append((object: { [weak observer] in observer }, callback: callback))
71+
observers.append(Observer(object: observer, callback: callback))
6572
return self
6673
}
6774

@@ -71,7 +78,7 @@ open class StateMachine<State: StateMachineHashable, Event: StateMachineHashable
7178

7279
public func stopObserving(_ observers: [AnyObject?]) {
7380
self.observers.removeAll {
74-
guard let object: AnyObject = $0.object()
81+
guard let object: AnyObject = $0.object
7582
else { return true }
7683
return observers.contains { $0 === object }
7784
}
@@ -104,9 +111,9 @@ open class StateMachine<State: StateMachineHashable, Event: StateMachineHashable
104111
}
105112

106113
private func notify(_ result: Transition.Result) {
107-
var observers: [(object: () -> AnyObject?, callback: Transition.Callback)] = []
114+
var observers: [Observer] = []
108115
for observer in self.observers {
109-
guard observer.object() != nil
116+
guard observer.object != nil
110117
else { continue }
111118
observers.append(observer)
112119
observer.callback(result)

0 commit comments

Comments
 (0)