2015-09-02 7 views
9

Ich bin in einem Fehler, wo ich nicht sicher bin, ob es eine Einschränkung der Swift-Sprache oder ein Fehler ist. Hier ist die grundlegendste Prämisse:Subclassing Swift Generic Class mit NSObject Vererbung

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 

Ich bekomme keine Compiler-Warnungen hier, aber die Unterklasse weigert sich zu instanziieren. Ich habe ein komplizierteres Ziel innerhalb der Untergliederung spezifischer Kontexte eines Generikums, aber dieses grundlegende Problem oben ist, worauf ich es hindeutete.

Interessanterweise, wenn ich die NSObject-Vererbung auf der GenericClass (und der super.init() von der Init-Methode des Generik) entfernen, funktioniert diese Einrichtung ohne Problem, also denke ich, dass es etwas damit zu tun haben muss Ich erben von NSObject. Meine vollständige Implementierung MUSS von einer NSOperation erben (ich mache im Grunde benutzerdefinierte NSOperation-Klassen mit einer generischen Oberklasse), so dass das Erben von NSObject (d. H. NSOperation) für mich nicht optional ist.

Es ist störend, dass es keine Compilerfehler gibt und ich etwas so fies wie ein EXC_BAD_ACCESS bekomme. Es lässt mich denken, dass das vielleicht funktionieren soll, aber momentan nicht. Ich weiß, dass sie erst kürzlich damit begonnen haben, die Unterklassenbildung in Swift zu unterstützen. Ich betreibe die neueste xCode Beta 6.

Jeder Einblick geschätzt!

Antwort

2

Ich bin mir ziemlich sicher, dass es ein Fehler ist. Interessanterweise funktioniert alles einwandfrei, wenn Sie die initializers löschen, auch wenn Sie von NSObject erben:

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>") 

Eine unordentlichen Abhilfe könnte es sein, Standard-Protokoll-Implementierungen zu verwenden, und dann erweitert NSOperation eine neue Operation von Ihrem Protokoll zu initialisieren, aber es ist wahrscheinlich besser, nur einen Fehlerbericht zu erstellen und darauf zu warten, dass sie das beheben :)

+0

Danke für die Antwort Aaron. Ich stimme zu, es riecht wie ein Käfer. Ich habe einen Fehlerbericht eingereicht. Wir werden sehen, was passiert :) Wird in der Zwischenzeit Ihre Protokoll-Idee einen Schuss geben. – erendiox

+0

Ja, ich glaube, das war tatsächlich ein Fehler. Es ist jetzt in Swift 3 behoben, und es wurde in Swift 3 Language Changes nicht erwähnt: https://swift.org/blog/swift-3-0-released/ – 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