gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 06:26:13 26 4
gpt4 key购买 nike

我正在使用 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()
}
}

这段代码给我“无法推断通用参数‘Type’”错误。

我试过:

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

但是没用...

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

最佳答案

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

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 in func myFunction .. .ClassC

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

关于Swift 在泛型类中使用泛型函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41800521/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com