Swift,如何传递多种类型的闭包?

时间:2016-09-22 03:30:43

标签: swift function closures

func test1(user: String, completion: @escaping (TestModel) -> Void) {
    test2(user: "test", completion: completion as! (Any) -> Void //failed here)
}

func test2(user: String, completion: @escaping (Any) -> Void) {
    completion(user)
}

我想将test1的闭包传递给test2,但是test2的闭包可能有多种类型,运行时会出错,EXC_BAD_INSTRUCTION

这样做可以通过吗?

2 个答案:

答案 0 :(得分:1)

这是对通用的滥用。如果您不关心将哪个类型用作completion的参数,请将其参数键入为Any:

func test(user: String, completion: @escaping (Any) -> Void) {
    completion(user)
}

答案 1 :(得分:1)

上述方法中的

completion必须采用T类型的参数。因此,您用作completion的参数的任何内容也必须属于T类型。因此user必须是T类型,即

func test<T>(user: T, completion: @escaping (T) -> Void)
{
    completion(user)
}