Swift ';通用参数';T';无法推断';

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:

我不知道为什么会发生这种情况,我想根据MyProtocol使用数组返回一个参数,因此我尝试通过以下方式实现:

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如果你觉得这有帮助的话,请考虑接受我的回答。