2015-09-02 27 views
9

Sto riscontrando un errore in cui non sono sicuro se si tratta di una limitazione della lingua Swift o di un bug. Ecco la premessa di base:Sottoclasse Swift Generic Class con ereditarietà NSO

class GenericClass<T> : NSObject { 

    var inputValue: T 

    init(value: T) { 
     self.inputValue = value 
     super.init() 
    } 
} 

class SubClass : GenericClass<String> { 

    override init(value: String) { 
     super.init(value: value) 
     } 

    } 

var test = GenericClass(value: "test") //Succeeds 
var test2 = SubClass(value: "test2") //Fails with EXC_BAD_ACCESS 

sto ottenendo nessun avviso del compilatore qui, ma la sottoclasse si rifiuta di istanziare. Ho un obiettivo più complicato all'interno della sottoclasse di contesti specifici di un generico, ma questo problema di base sopra è quello a cui l'ho ridotto.

È interessante notare che se rimuovo l'ereditarietà NSO su GenericClass (e il super.init() dal metodo init generico), questa configurazione funziona senza problemi, quindi penso che debba avere qualcosa a che fare con il fatto che sto ereditando da NSObject. La mia piena implementazione DEVE ereditare da una NSOperation (fondamentalmente sto facendo classi NSOperation personalizzate con una superclasse generica), quindi ereditare da NSObject (cioè NSOperation) non è opzionale per me.

È fastidioso che non ci siano errori del compilatore e sto ricevendo qualcosa di spiacevole come un EXC_BAD_ACCESS. Mi fa pensare che forse questo dovrebbe funzionare, ma non è al momento. So che solo da poco hanno iniziato a supportare la sottoclasse di classi generiche in Swift. Sono in esecuzione l'ultima versione beta di xCode 6.

Qualsiasi comprensione apprezzata!

risposta

2

Sono abbastanza sicuro che sia un bug. È interessante notare che tutto funziona bene se si eliminano i inizializzatori, anche quando si eredita dalla NSObject:

class GenericClass<T> : NSObject { 

} 

class SubClass : GenericClass<String> { 

} 

var test : GenericClass<Int> = GenericClass() // Succeeds 
var test2 = SubClass() // Succeeds 
var test3 : GenericClass<String> = SubClass() // Succeeds 
var test4 : GenericClass<Int> = SubClass() // Fails ("cannot convert SubClass to GenericClass<Int>") 

Una soluzione disordinato potrebbe essere quella di utilizzare implementazioni del protocollo di default, e quindi estendere NSOperation per inizializzare una nuova operazione dal protocollo, ma è probabilmente meglio solo presentare una segnalazione di bug e attendere che risolvano questo :)

+0

Grazie per la risposta Aaron. Sono d'accordo, puzza come un insetto. Ho inviato una segnalazione di bug. Vedremo cosa accadrà :) Darà al tuo protocollo un'idea nel frattempo. – erendiox

+0

Sì, credo che questo fosse davvero un bug. Ora è stato risolto in Swift 3 e non è stato menzionato nelle modifiche alla lingua Swift 3: https://swift.org/blog/swift-3-0-release/ – ganzogo

1
import Foundation 

class GenericClass<T> : NSObject { 

    var inputValue: T 

    init(value: T) { 
     print(value) 
     inputValue = value 
     super.init() 

    } 
} 

class SubClass<T> : GenericClass<T> { 

    override init(value: T) { 
     super.init(value: value) 
    } 

} 

let test = GenericClass(value: "test") //Succeeds 
test.inputValue 
let test2 = SubClass(value: "test2") //Succeeds 
test2.inputValue 
let test3 = GenericClass(value: 3.14) //Succeeds 
test3.inputValue 
let test4 = SubClass(value: 3.14)  //Succeeds