2015-02-02 6 views
9

io non riesco a capire che cosa sto facendo male per produrre il seguente errore:Non riuscendo a creare una sottoclasse NSInputStream da Swift (initWithData: unrecognizer selettore)

2015-02-02 12:48:17.029 InputStreams[14816:221224] -[InputStreams.CustomStream initWithData:]: unrecognized selector sent to instance 0x7fda2e1aac30 

Ecco il mio CustomStream sottoclasse.

import Foundation 

class CustomStream : NSInputStream { 
    let streamName = "My Custom Stream" 

    override init(data: NSData) { 
     super.init(data: data) 
    } 
} 

Ed ecco un rapido esempio di come sto cercando di creare un'istanza di esso:

import UIKit 

class ViewController: UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     let stream = CustomStream(data: NSData()) 
     println("Stream Name: \(stream.streamName)") 
    } 
} 

Qualsiasi aiuto sarebbe molto apprezzato.

+0

Quindi stiamo pensando che questo sia un bug? Dato che questo è rimasto aperto per molti giorni, penso che sia giunto il momento di presentare un radar. – cnoon

+1

Ho archiviato il seguente [radar] (http://openradar.appspot.com/radar?id=4504359098384384). Per favore duplica se hai lo stesso problema. Se non lo fai e capito, per favore aiuto! – cnoon

+0

Ho riscontrato lo stesso problema. Francamente, mi colpisce anche come un bug che devo chiamare uno dei loro inizializzatori designati (ad esempio con 'NSData' o' NSURL') quando l'intero scopo della sottoclasse è che probabilmente non voglio usare nessuno di questi. Francamente, la sottoclasse di 'NSInputStream' è sempre stata problematica (vedi http://blog.bjhomer.com/2011/04/subclassing-nsinputstream.html), ma speravo che avessero guardato a questo argomento [negli ultimi 8 anni] (http://lists.apple.com/archives/macnetworkprog/2007/May/msg00056.html). – Rob

risposta

0

Ho trovato una soluzione utilizzando convinence init.

class CustomStream : NSInputStream { 
    let streamName = "My Custom Stream" 
    // var data:NSData!   

    convenience override init(data: NSData) { 
     self.init() 
     // do inialization. 
     // self.data = data 
    } 

    convenience init() { 
     self.init() 
    } 
} 

Per essere onesti non ho capito il motivo per cui lavori.Spero sto riferendo a Class Inheritance and Initialization per più information.Please lasciare un commento se avete qualche idea in proposito.

Una cosa di più, è considerato più sicuro da usare CFCreateBounderPair piuttosto che per creare una sottoclasse NSInputStream .I hanno cercato di convertire ALAsset a NSInputStream con successo in entrambi i modi codice successfully.The è disponibile qui ALAssetToNSInputStream.