给定一个类:
class First<T> {
}
还有一个类First的方法:
func second<U>(closure: (value: T) -> U) {
}
我该如何储存作为参数传递给second
的闭包,以便稍后调用它?
您需要在类中声明U,以便您拥有存储的类型:
class First<T,U> {
var f : ((T) -> U)! = nil
func second(closure: @escaping (T) -> U) {
self.f = closure
}
}
value:
现在是非法的,并且需要使用 @escaping
来表示该函数不是用于立即执行的。 - mattsecond
适用于一种类型,那么马特的回答就足够好了。class First<T, U> {
typealias ClosureType = (value: T) -> U
var savedClosure: ClosureType? = nil
func second(closure: ClosureType) {
savedClosure = closure
}
}
protocol P {}
class First<T> {
typealias ClosureType = (value: T) -> P
var savedClosure: ClosureType? = nil
func second<U: P>(closure: (value: T) -> U) {
savedClosure = closure
}
}
Any
。class First<T> {
typealias ClosureType = (value: T) -> Any
var savedClosure: ClosureType? = nil
func second<U>(closure: (value: T) -> U) {
savedClosure = closure
}
}
但我们不知道您想要做什么,所以对于您的问题有多个答案......例如,也许您想为每种类型存储单独的闭包?
class First<T> {
typealias ClosureType = (value: T) -> Any
var savedClosures = [String: ClosureType]()
func second<U>(closure: (value: T) -> U) {
savedClosures[String(U)] = closure
}
}
无论如何,真正的问题是:“你真的需要这样做吗?有没有一些简单的改变可以避免这种需要?”
T
映射到 U
。你的解决方案的问题在于,每次我想要将例如 int
映射到 string
的时候,我都必须实现自己版本的字符串,以符合类型 P
的协议。但创意值得点赞! - Rob Sandersextension String: P {}
,但如果使用 Any
的话就不需要了,因为“所有类型都隐式地符合”它。 - NiñoScript