【问题标题】:Is it possible to constrain a swift generic type to be any closure是否可以将 swift 泛型类型限制为任何闭包
【发布时间】: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 为例)。您还可以将闭包包装在泛型中(无论出于何种原因),并确保它实际上是一个被包装的闭包类型。

标签: swift generics swift2


【解决方案1】:

你必须声明2个泛型参数,一个用于参数类型,一个用于返回类型:

class MyClass <Arg, Result> {
    let closure: Arg -> Result

    init(closure: Arg -> Result) {
        self.closure = closure
    }

    func call(arg: Arg) -> Result {
        return self.closure(arg)
    }
}

let obj = MyClass { (a: Int, b: String) -> String in
    return "a: \(a), b: \(b)"
}

obj.call((42, "Hello"))  // -> "a: 42, b: Hello"

【讨论】:

  • 不是我所希望的,但它似乎是解决方案。
猜你喜欢
  • 1970-01-01
  • 2013-07-31
  • 1970-01-01
  • 2015-02-04
  • 2011-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多