2014-08-28 32 views
15
func myfunc<T>(i:T) -> T { 
    return i 
} 

是否有可能使这个通用函数成为闭包?是否可以在Swift中创建通用闭包?

let myfunc = { <T>(i:T) -> T in 
    return i 
} 

这行不通......

+1

类似(相同?)问题在这里:http://stackoverflow.com/questions/25401584/generics-as-parameters-to-aclosure-in-swift。 – 2014-08-28 09:28:26

+1

泛型不能用于闭包。 @MartinR链接的答案提供了一种解决方法。我不认为这个问题是重复的,因为另一个问题是关于泛型工作的封闭,而这是泛型是否可以使用的明确问题。 – Antonio 2014-08-28 09:41:09

+0

我相信答案是这不起作用,因为它实际上没有任何意义(特别是与Swift无关)。 'myfunc'应该是一个抽象类型,这与试图构造一个抽象类相同。我在@MartinR链接的回答中讨论更多。 – 2014-08-28 13:40:17

回答

8

没有,因为变量和表达式不能通用。只有通用函数和通用类型。


澄清:在某些语言中,您可以使用通用量词类型,如forall a. a -> a。但在Swift中,类型不能有一个通用的量词。所以表达式和值不能是通用的。函数声明和类型声明可以是通用的,但是当你使用这样的通用函数或者这样的泛型类型的实例时,选择某种类型(可以是实型或类型变量)作为类型参数,然后你获得的价值不再是通用的。

+0

你是对的,谢谢你,谢谢Rob Napier。 – 2014-08-29 03:17:36

+1

我同意Rob的意思,它应该将'typealias'与闭包一起使用来定义通用闭包类型 – Mazyod 2015-10-06 20:24:49

+0

在大多数编程语言中,泛型函数参数实际上只是函数参数,其中的值-时间。所以这意味着泛型参数的可能值是在编译时计算的,而不是仅仅在运行时使用(如普通函数/闭包参数)。优点是能够用编译时需要评估的类型对闭包进行参数化,例如, 'StringLiteralConvertible'。我认为你的困惑在于把变量或表达看作通用的;相反,它是通用的关闭。 – 2016-06-22 03:18:18

相关问题