Я подклассифицирую NSOperation
в Swift и должен переопределить свойства isExecuting
и isFinished
, так как я переопределяю метод start
.
Проблема, с которой я сталкиваюсь, заключается в том, как сохранить наблюдение за ключом (KVO), а также переопределить эти свойства.
Обычно в Obj-C было бы довольно легко переопределить свойства как readwrite
в определении расширения класса JSONOperation ()
. Тем не менее, я не вижу такой же возможности в Swift.
Пример:
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)
})
}
}
Итак, вот решение, которое я придумал, но он чувствует себя ужасно уродливым и взломанным:
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 }
}
Скажи, что есть лучший способ. Я знаю, что я мог бы сделать var isExecuting
вместо целого struct
, но тогда у меня есть два одинаково названных свойства, которые вводят двусмысленность, а также делают его общедоступным для записи (чего я не хочу).
О, что бы я сделал для некоторых ключевых слов-модификаторов доступа...