我在swift中遇到了泛型问题。让我们公开我的代码。
Parsable protocol:
protocol Parsable {
associatedtype T
var value: String {get set}
init(value: String)
func parseString() -> T
}
通用类:
class ParsableGeneric<T: Parsable> {
var value: String
init(v: String) {
value = v
}
func parse() -> T{
return T(value: self.value)
}
}
Int Type的实现:
class ParsableIntNew: ParsableGeneric<IntParse> {}
struct IntParse: Parsable {
func parseString() -> Int {
return Int(value)!
}
var value: String
typealias T = Int
}
然后我有这样的函数,我想返回一个ParsableGeneric Type:
func test<T: Parsable>() -> ParsableGeneric<T> {
let intclass = ParsableIntNew(v: "54")
let number: Int = intclass.parse().parseString()
return intclass
}
但我在return intclass
中遇到错误(无法转换类型&#39; ParsableIntNew&#39;的返回表达式返回类型&#39; ParsableGeneric&#39;
为什么会这样。我正在返回正确的值。
谢谢,我希望我找到一个很好的解决方案。
答案 0 :(得分:1)
您的test()
函数基本上承诺&#34;我将为ParsableGeneric<T>
&#34;的任何T
返回Parsable
个对象。但是,该实现仅返回ParsableIntNew
,即仅在T
为IntParse
时才有效。
想象一下当你还有一个BoolParse: Parsable
时会发生什么,并且当你致电test()
T
BoolParse
时编译器得出结论。即使函数返回类型为ParsableGeneric<IntParse>
,该函数仍将返回ParsableGeneric<BoolParse>
。