I've been loving ReactiveCocoa 3.0 (now that I've finally grok'd it), and today I was able to switch to the swift2 branch to start updating Tacks's Swift 1.2 code for iOS9.0.
Aside from converting all usages of '|>
' to simply '.
' instead ( which is much better! we now have code completion! 🎉), a few things tripped me up when switching to the Swift 2.0 api.
.Catch()
Firstly, catch
is now a reserved word in Swift 2.0, so you should simply replace all usages with flatMapErrors
- it's the same.
.Start()
edit: as of Sept 7th, convenience methods have been added to get around this, i.e. startWithNext
, startWithCompleted
, startWithError
, as well as for observing Signals: observeNext
, etc.
Secondly, the compiler now seems to have problems identifying which default parameter it should use when you pass a closure to start:
. The method signature of start:
is really:
start(error error: (E -> ())? = nil, completed: (() -> ())? = nil, interrupted: (() -> ())? = nil, next: (T -> ())? = nil) -> Disposable
and previously it was common to use the following shorthand:
producer.start { value in ... }`
Which would really mean (I assume because next
was the last parameter?):
producer.start(next: {value in ...})
The Swift 2.0 compiler (Xcode 7 b6, at least) makes a different decision about what we're trying to do. Due to the fact that we're passing a single block parameter, it now assumes that we want to call the start(sink: Event<T, E>.Sink)
method instead. This is our clue that something's not right, as we start seeing that our blocks are being passed variables of type Event<YourType, NoError>
rather than the expected type.
The solution is easy: either just be clearer about what you're calling by reinstating the next:
parameter name:
producer.start(next: {value in ...})`
.. or provide more type information in your closure, to help the poor compiler out:
producer.start { (displayableAnnotations: YourType) in ... }
.Put()
We no longer use .put(x)
to set the value on a MutableProperty
type - .value
is now settable, so we just get and set .value
directly. This is probably good, though I liked the separation before - it made it more obvious that MutableProperty also dealt in events. But like I say, it's probably simpler now.
Edit: Extra!
Don't forget to remove the Box dependancy as well, because it's no longer needed with Swift 2.0