【发布时间】:2015-09-01 12:32:02
【问题描述】:
虽然可以定义闭包签名并将其用作泛型类型的具体类型,但是否可以仅将泛型的可能类型限制为闭包 - 因此用户无法将其设置为以字符串为例。类似于以下内容:
class MyClass <T where T:Closure> {
init(closure:T) {
closure()
}
}
所以用户可以传递他们想要的任何闭包(接受任何参数、返回值、抛出状态等),但它必须是一个闭包。
【问题讨论】:
-
你会如何处理任意闭包?是否有反射工具可以让您在 Swift 中检查/调用它?
-
例如,如果 MyClass 执行我定义的不同的闭包,它接受 T 作为参数。用户可以传入他们应该在该闭包中执行的代码,然后调用他们定义的闭包 T,并传入他们自己的参数。
-
@Bill 如果您可以将泛型类型限制为某种闭包协议(可能通过某种方式访问参数和结果相关类型),您可以构建更好的弱观察者/事件类(请参阅blog.scottlogic.com/2015/02/05/swift-events.html 为例)。您还可以将闭包包装在泛型中(无论出于何种原因),并确保它实际上是一个被包装的闭包类型。