2016-07-19 6 views
0

Я создал подкласс NSInputStream, но когда он считывает фактические данные, я получаю следующее исключение.Подкласс NSInputStream, переопределяющий делегат?

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -setDelegate: only defined for abstract class. Define -[EventusCore.FileUploadStream setDelegate:]!' 

Я не могу переопределить следующее свойство NSStream абстрактного класса:

unowned(unsafe) public var delegate: NSStreamDelegate? 

Вот мой класс, который наследует от NSInputStream

class InputStream : NSInputStream { 

    private var currentStatus: NSStreamStatus = .Closed 

// override var delegate: NSStreamDelegate? 

    weak var delegate: NSStreamDelegate? 

    override func open() { 
     self.currentStatus = .Open 
    } 

    override func close() { 
     self.currentStatus = .Closed 
    } 

    override var streamStatus: NSStreamStatus { 
     return self.currentStatus 
    } 

    override var hasBytesAvailable: Bool { 
     return self.currentStatus == .Open 
    } 

    // MARK: NSInputStream and CFReadStream abstract method overrides 

    override func scheduleInRunLoop(aRunLoop: NSRunLoop, forMode mode: String) { 

    } 

    override func removeFromRunLoop(aRunLoop: NSRunLoop, forMode mode: String) { 

    } 

} 

Здесь ошибка я получаю : enter image description here

Что я делаю неправильно? Возможно ли это вообще с помощью Swift?

+0

подклассов NSInputStream, кажется, (ваше любимое ругательство здесь). См. Например, http://blog.bjhomer.com/2011/04/subclassing-nsinputstream.html (что касается Objective-C, но описывает проблему) или http://www.openradar.me/19809067. –

+0

Спасибо за напоминание о типографии. Я уже читал этот blogpost, но не получил никакой информации о том, как решить эту конкретную проблему. :( –

ответ

1

Нал подходящий способ переопределить переменную делегату

var localdelegate: NSStreamDelegate? 

override var delegate: NSStreamDelegate? { 
    set { 
     self.localdelegate = newValue 
    } 
    get { 
     return self.localdelegate 
    } 
}