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

时间:2018-10-18 06:48:34

标签: 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:ArrayTest>( kk: ((_ value:T) -> Void)?){

 }
}

class AAA<T:ArrayTest> {

    func ggg(){
     BBB().ggg { (test) in//Generic parameter 'T' could not be inferred 
 here

     }
 }
 }

2 个答案:

答案 0 :(得分:2)

您不能只做BBB().ggg { (test: [Test]) in ...,因为[Test]不符合ArrayTest

如您所写,这可能会让您感到惊讶:

extension Array : ArrayTest where Element: Test{
    typealias E = Element
}

上面的扩展名肯定适用于[Test],对吗?否。要应用上述扩展名,Element必须符合Test,但必须符合Test does not conform to itself

我想你可能是这个意思:

class AAA<T:ArrayTest> {

    func ggg(){
        BBB().ggg { (test: T) in

        }
    }
}

这使用T声明中的AAA

作为AAA类的用户,您需要传递符合ArrayTest的实际类型,例如[U],其中U是符合类型的类型到Test

答案 1 :(得分:0)

编译器无法定义通用参数#include<string> #include<iostream> using namespace std; class test_temp { public: static string name; static int count_of_letters(); }; string test_temp::name="Vishal"; int test_temp::count_of_letters() { auto result = []() {return(name.size());}; result(); } int main() { int res=test_temp::count_of_letters(); cout<<res<<endl; } 的类型。您需要明确指定T的类型:

T