Swift ';通用参数';T';无法推断';
我不知道为什么会发生这种情况,我想根据MyProtocol使用数组返回一个参数,因此我尝试通过以下方式实现:Swift ';通用参数';T';无法推断';,swift,generics,Swift,Generics,我不知道为什么会发生这种情况,我想根据MyProtocol使用数组返回一个参数,因此我尝试通过以下方式实现: import Foundation protocol Test { } protocol ArrayTest { associatedtype E : Test } extension Array : ArrayTest where Element:Test{ typealias E = Element } class BBB { func ggg<T:
import Foundation
protocol Test {
}
protocol ArrayTest {
associatedtype E : Test
}
extension Array : ArrayTest where Element:Test{
typealias E = Element
}
class BBB {
func ggg<T:ArrayTest>( kk: ((_ value:T) -> Void)?){
}
}
class AAA<T:ArrayTest> {
func ggg(){
BBB().ggg { (test) in//Generic parameter 'T' could not be inferred
here
}
}
}
<代码>导入基础
协议测试{
}
协议阵列测试{
关联类型E:测试
}
扩展数组:ArrayTest,其中元素:Test{
类型别名E=元素
}
BBB级{
func-ggg(kk:((值:T)->Void)?){
}
}
AAA级{
func ggg(){
无法推断//泛型参数“T”中的BBB().ggg{(测试)
在这里
}
}
}
编译器无法定义泛型参数类型
t
。您需要明确指定T
的类型:
BBB()ggg { (test: [Test]) in
}
您不能只在…中执行
BBB().ggg{(test:[test]),因为[test]
不符合ArrayTest
正如您所写,这可能会让您感到惊讶:
extension Array : ArrayTest where Element: Test{
typealias E = Element
}
当然,上述扩展适用于[Test]
,对吗?否。要应用上述扩展,元素
必须符合测试
,但是
我想你的意思是:
class AAA<T:ArrayTest> {
func ggg(){
BBB().ggg { (test: T) in
}
}
}
AAA级{
func ggg(){
BBB().ggg{(test:T)in
}
}
}
这使用了AAA
声明中的T
作为AAA
类的用户,您需要传递符合ArrayTest
的实际类型,例如[U]
,其中U
是符合Test的类型,您希望Test
在BBB()行中是什么类型。ggg{(Test)在
?带有元素的数组是测试类型有时编译器似乎还不如我们聪明,所以您需要在//…<中显式注释类型:BBB().ggg{(Test:T){(Test:T)
更好的命名(使用“真实世界”名称,而不是ggg
和kk
,等等),并解释你正在努力实现的目标会有所帮助。它很有效!非常感谢。这对我帮助很大,但我还需要了解一段时间while@Dandelion如果你觉得这有帮助的话,请考虑接受我的回答。