我遇到了一个错误,我不确定它是否是Swift语言或bug的限制。这是最基本的前提:
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
我这里没有收到编译器警告,但Subclass拒绝实例化。我在子类化泛型的特定上下文中有一个更复杂的目标,但上面这个基本问题是我把它归结为。
有趣的是,如果我删除GenericClass上的NSObject继承(以及来自泛型的init方法的super.init()),这个设置没有问题,所以我认为它必须有一些东西与我从NSObject继承的事实有关。我的完整实现必须继承自NSOperation(我基本上使用通用超类生成自定义的NSOperation类),所以继承NSObject(即NSOperation)对我来说不是可选的。
令人烦恼的是,没有编译器错误,我得到的东西和EXC_BAD_ACCESS一样令人讨厌。这让我觉得也许这应该有效,但目前还不行。我知道他们最近才开始支持Swift中泛型类的子类化。我正在运行最新的xCode beta 6。
任何洞察力都赞赏!
答案 0 :(得分: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
以从协议初始化新操作,但是提交错误报告并等待它们可能更好解决这个问题:))
答案 1 :(得分: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