2017-04-24 80 views
1

我有一个函数与此签名写在斯威夫特项目在Xcode 7.3.1:泛型参数“T”不能推断/不能明确专门的通用功能

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

由于@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"; }) 
0

我不知道为什么它是导致它,但它编译于3迅速使这条错误消息出现:

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

于是,我就明确添加的返回类型为封:

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

和它的工作。

+0

在Xcode 7.3.1中,我得到'不能用'(() - > String)类型的参数列表调用'DLog'。 – alik

+0

这是因为当参数的类型具有'@ autoclosure'时你指定了一个闭包?你不能'@ autoclosure'关闭。 – BallpointBen

+0

@alik尝试删除自动关闭属性 – Sweeper