Swift在泛型类中使用泛型函数

时间:2017-01-23 06:37:30

标签: swift generics swift3

我正在使用Generic开发应用程序。

但是在泛型类中使用泛型函数存在问题。

如您所知,我们使用泛型:

class ClassA{
    static func myFunction<Type>()->Type where Type : Protocol1, Type : Protocol2{
        ...
        return Type
    }
}


class ClassB{
    func myFunction(){
        let a : ClassC = ClassA.myFunction()
    }
}

class ClassC : Protocol1, Protocol2{

}

而且,这很有效。

但我想做的是:

class ClassA{
    static func myFunction<Type>()->Type where Type : Protocol1, Type : Protocol2{
        ...
        return Type
    }
}


class ClassB<Type : Protocol1, Protocol2>{
    func myFunction(){
        let a : Type = ClassA.myFunction()
    }
}

这段代码给了我&#34;通用参数&#39; Type&#39;无法推断&#34;错误。

我尝试过:

class ClassB<Type> where Type : Protocol1, Type : Protocol2{

但是没有用......

是否可以使用泛型类型来推断其他泛型类型?

1 个答案:

答案 0 :(得分:1)

我会说你搞砸了一下类型推断。它是如何工作的:通常你有这样的东西:

var a = "Some string"

在这种情况下,由于指定值而推断a的类型 - 已知它是String而没有别的。

更复杂的例子:

func returnString() -> String {
    return "Some string"
}
var b = returnString()

在这种情况下,从函数签名推断类型,从返回类型 - 它是String,并在其签名中声明:-> String。编译器肯定知道,b的类型为String

随着泛型类型推断变得有点复杂。让我们来看看你的功能:

let a : Type = ClassA.myFunction()

我们在这看到什么? a属于未知类型,编译器应该从您正在调用的函数中推断出类型。我们开工吧!看一下函数签名:

static func myFunction<Type>()->Type where Type : Protocol1, Type : Protocol2

作为编译器,我会感到困惑,因为函数的返回类型必须从其他地方反过来推断,在这种情况下,“某处”恰好是您定义并希望赋值的变量类型(因为没有其他地方,真的)。但是,您没有指定变量的类型。这正是为什么你得到“通用参数'类型'无法推断”错误 - 表达式的两面都是未知类型,必须相互推断

它在这里工作:

let a : ClassC = ClassA.myFunction()

正因为如此 - 您指定的不是抽象类型,但具体类型: ClassC和编译器知道,它必须用Type替换func myFunction ...中的ClassC

总而言之,我会说,像你这样的泛型函数类型推断在完全不同的方向上工作 - 而不是从被调用的函数推断变量的类型,从变量推断的函数类型。