我正在使用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{
但是没有用......
是否可以使用泛型类型来推断其他泛型类型?
答案 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
。
总而言之,我会说,像你这样的泛型函数类型推断在完全不同的方向上工作 - 而不是从被调用的函数推断变量的类型,从变量推断的函数类型。