Substituições da propriedade NSOperation (isExecuting / isFinished)
Eu estou subclassificandoNSOperation
no Swift e precisa substituir oisExecuting
eisFinished
propriedades desde que eu estou substituindo ostart
método.
O problema que encontro é como preservar a observação do valor-chave (KVO), além de poder substituir essas propriedades.
Normalmente, no Obj-C, seria muito fácil redefinir as propriedades comoreadwrite
na extensão de classeJSONOperation ()
definição. No entanto, não vejo esse mesmo recurso no Swift.
Exemplo:
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)
})
}
}
Então, aqui está a solução que eu encontrei, mas ela é terrivelmente feia e 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 }
}
Por favor, diga-me que existe uma maneira melhor. Eu sei que eu poderia fazer umavar isExecuting
em vez do todostruct
, mas tenho duas propriedades com nomes semelhantes que introduzem ambiguidade e também a tornam publicamente gravável (o que eu não quero).
Ah, o que eu faria por algumas palavras-chave do modificador de acesso ...