使用Swift返回一个函数中的泛型类型(无法转换类型的返回表达式...)

时间:2017-05-28 08:44:30

标签: swift generics

我在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;

为什么会这样。我正在返回正确的值。

谢谢,我希望我找到一个很好的解决方案。

1 个答案:

答案 0 :(得分:1)

您的test()函数基本上承诺&#34;我将为ParsableGeneric<T>&#34;的任何T返回Parsable个对象。但是,该实现仅返回ParsableIntNew,即仅在TIntParse时才有效。

想象一下当你还有一个BoolParse: Parsable时会发生什么,并且当你致电test() T BoolParse时编译器得出结论。即使函数返回类型为ParsableGeneric<IntParse>,该函数仍将返回ParsableGeneric<BoolParse>