似乎 swift 在处理泛型类时存在一些问题。似乎这些代码可以编译,但在遇到 println(act.actId)
时会出现运行时错误。它抛出了一个EXC_BAD_ACCESS
错误。
对于这个问题还有其他方法或解决方法吗?
public class Item {
public var id: String
public init(str: String) {
id = str
}
}
public class Account: Item {
public var actId: String
public override init(str: String) {
actId = "antId: \(str)"
super.init(str: str)
}
}
public class Keyword: Item {
public var keywordId: String
public override init(str: String) {
keywordId = "keywordId: \(str)"
super.init(str: str)
}
}
public class Creator<T: Item> {
public func parse(str: String) -> T {
var result: T = T(str: str)
return result
}
}
var a = Creator<Account>()
var act = a.parse("Apple")
println(act.actId)
最佳答案
就我而言,这不会在 Playground 上编译。
Subclasses do not inherit their superclass initializers by default -> Apple
您需要将 init()
标记为 required
我已经改变了它,现在它可以工作了
public class Item {
public var id: String
public required init(str: String) {
id = str
}
}
public class Account: Item {
public var actId: String
public required init(str: String) {
actId = "antId: \(str)"
super.init(str: str)
}
}
public class Keyword: Item {
public var keywordId: String
public required init(str: String) {
keywordId = "keywordId: \(str)"
super.init(str: str)
}
}
public class Creator<T: Item> {
public func parse(str: String) -> T {
let result: T = T(str: str)
return result
}
}
var a = Creator<Account>()
var act = a.parse("Apple")
print(act.actId)
参见similar question了解更多详情
关于使用泛型类时 Swift 抛出运行时错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32087299/