我有一个带有此签名的函数,该函数在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
参数中构建文本并将其正确传递给函数?
答案 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}}
并且有效。