I am subclassing NSOperation
in Swift and need to override the isExecuting
and isFinished
properties since I am overriding the start
method.
The problem I run into is how to preserve key-value observing (KVO) while also being able to override these properties.
Normally in Obj-C this would be rather easy to redeclare the properties as readwrite
in the class extension JSONOperation ()
definition. However, I don't see this same capability in Swift.
Example:
class JSONOperation : NSOperation, NSURLConnectionDelegate
{
var executing : Bool
{
get { return super.executing }
set { super.executing } // ERROR: readonly in the superclass
}
// Starts the asynchronous NSURLConnection on the main thread
override func start()
{
self.willChangeValueForKey("isExecuting")
self.executing = true
self.didChangeValueForKey("isExecuting")
NSOperationQueue.mainQueue().addOperationWithBlock(
{
self.connection = NSURLConnection(request: self.request, delegate: self, startImmediately: true)
})
}
}
So here is the solution I have come up with, but it feels awfully ugly and hacky:
var state = Operation()
struct Operation
{
var executing = false
var finished = false
}
override var executing : Bool
{
get { return state.executing }
set { state.executing = newValue }
}
override var finished : Bool
{
get { return state.finished }
set { state.finished = newValue }
}
Please tell me there is a better way. I know I could make a var isExecuting
instead of the whole struct
, but then I have two similarly named properties which introduces ambiguity and also makes it publicly writable (which I do not want).
Oh what I would do for some access modifier keywords...