2015-09-02 165 views
9

我遇到了一个错误,我不确定它是否是Swift语言的限制或错误。这里是最基本的前提:继承NSObject继承Swift通用类

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 

我在这里没有编译器警告,但是子类拒绝实例化。在泛型的具体环境的子类中,我有一个更复杂的目标,但是上面这个基本问题正是我所要解决的。有趣的是,如果我删除GenericClass上的NSObject继承(以及泛型的init方法中的super.init()),这个设置没有问题,所以我认为它必须与事实有关我从NSObject继承。我的完整实现必须从NSOperation继承(我基本上用一个通用的超类来自定义NSOperation类),因此从NSObject继承(即NSOperation)对我来说不是可选的。

令人烦恼的是,没有编译器错误,我得到的东西与EXC_BAD_ACCESS一样讨厌。这让我觉得这也许应该是有效的,但目前还不是。我知道他们最近才开始在Swift中支持泛型类的子类化。我正在运行最新的xCode beta 6.

任何洞察赞赏!

回答

2

我很确定这是一个错误。有趣的是,一切,如果你删除的初始化工作正常,甚至当你从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>") 

杂乱的解决办法可能是使用默认协议的实现,然后再扩展NSOperation从您的协议初始化一个新的操作,但它可能更好只是提交一个错误报告,并等待他们修复此问题:)

+0

感谢您的回复亚伦。我同意,它闻起来像一个错误。我提交了一个错误报告。我们将看到会发生什么:)在此期间将给你的协议想法一个镜头。 – erendiox

+0

是的,我相信这确实是一个错误。现在已经在Swift 3中修复了,在Swift 3语言变更中没有提及它: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