无法推断通用参数'T'/无法明确地专门化泛型函数

时间:2017-04-24 18:29:19

标签: swift xcode generics swift2

我有一个带有此签名的函数,该函数在Xcode 7.3.1中的Swift项目中编写:

func DLog<T>(@autoclosure object: () -> T, _ file: String = #file, _ function: String = #function, _ line: Int = #line) {
}

编译器对此调用抱怨Generic parameter 'T' could not be inferred

DLog({ var text = "Returning output list\n"; for outline in outlines { text = text + outline.debugDescription + "\n"; }; return text; })

当我尝试提供它抱怨的类型Cannot explicitly specialize a generic function时:

DLog<String>({ var text = "Returning output list\n"; for outline in outlines { text = text + outline.debugDescription + "\n"; }; return text; })

我尝试了更多方法,但没有满足编译器。我也没有找到如何解决这种情况的提示。

如何在() => T参数中构建文本并将其正确传递给函数?

2 个答案:

答案 0 :(得分:2)

由于@autoclosure属性,编译失败。当您将某个表达式传递给带@autoclosure的函数时,编译器会创建一个没有返回该表达式结果的参数的闭包。因此,当您传递{ var text = "Returning output list\n"; for outline in outlines { text = text + outline.debugDescription + "\n"; }; return text; }时,编译器会创建一个闭包,返回一个闭包返回字符串。

要解决此问题,您可以将()添加到表达式的结尾:

DLog({ () -> String in var text = "Returning output list\n"; for outline in outlines { text = text + outline.debugDescription + "\n"; }; return text; }())

或简化表达式到简单的方法调用,例如

DLog(outlines.reduce("Returning output list\n") { $0 + $1.debugDescription + "\n"; })

答案 1 :(得分:0)

我不知道它为什么会导致它,但是在swift 3中编译它会出现此错误消息:

  

无法推断出复杂的闭包返回类型;添加显式类型以消除歧义

所以我尝试显式添加闭包的返回类型:

{{1}}

并且有效。