我想更改以下代码
let views: [UIView] = []
views.forEach {
$0.removeFromSuperview()
}
以其他方式,我将函数UIView.removeFromSuperview
作为参数传递给forEach函数。
类似于
let views: [UIView] = []
views.map { /* transform views to be passed further */ }
.forEach(UIView.removeFromSuperview)
有可能吗?
更新
根据下面的答案和一些评论,我可以为自己总结一下这个问题的反馈。
基于后者,Chris Lattner在段落对现有代码的影响中提到了一些flip
函数。
我对其实施的假设是以下内容
func flip<T>(_ function: @escaping (T) -> () -> Void) -> (T) -> Void {
return { object in function(object)() }
}
因此,我们可以重写像
这样的初始代码views.forEach(flip(UIView.removeFromSuperview))
答案 0 :(得分:1)
只需在views.forEach {
$0.removeFromSuperview()
}
上调用该方法即可:
extension Sequence {
func onEach(_ invoke: (Iterator.Element) -> () -> Void) {
self.forEach { invoke($0)() }
}
}
(如果你愿意,你可以命名参数。)
但你也可以把它包装成一个方法:
rethrows
这是因为instance methods can be represented as functions that take an instance of their type并返回一个具有&#34;顶级&#34;的功能。签名。
此处的一个缺点是,您无法在forEach
中包含rethrows
注释,因为IOperation<?> parameter1 = null;
ITotallyDifferentOperation<?> parameter2 = null;
仅适用于函数参数本身正在投掷的情况