使用NSObject继承对Swift通用类进行子类化

时间:2015-09-02 00:35:15

标签: xcode swift generics exc-bad-access nsobject

我遇到了一个错误,我不确定它是否是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。

任何洞察力都赞赏!

2 个答案:

答案 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