Swift 作为参数传递闭包时的反应循环

Swift 作为参数传递闭包时的反应循环,swift,reactive-cocoa,Swift,Reactive Cocoa,我在Swift中使用ReactiveCocoa,如下所示: registerButton?.rac_signalForControlEvents(UIControlEvents.TouchUpInside).subscribeNextAs(registerButtonTapped) private func registerButtonTapped(button: UIButton){ // Method here } registerButton?.rac_signalForCon

我在Swift中使用ReactiveCocoa,如下所示:

registerButton?.rac_signalForControlEvents(UIControlEvents.TouchUpInside).subscribeNextAs(registerButtonTapped)

private func registerButtonTapped(button: UIButton){
    // Method here
}
registerButton?.rac_signalForControlEvents(UIControlEvents.TouchUpInside).subscribeNextAs({ [weak self] (button:UIButton) in
    self?.registerButtonTapped(button)
})
这将创建一个保留周期

我知道解决办法如下:

registerButton?.rac_signalForControlEvents(UIControlEvents.TouchUpInside).subscribeNextAs(registerButtonTapped)

private func registerButtonTapped(button: UIButton){
    // Method here
}
registerButton?.rac_signalForControlEvents(UIControlEvents.TouchUpInside).subscribeNextAs({ [weak self] (button:UIButton) in
    self?.registerButtonTapped(button)
})
但这迫使我使用
subscribeNextAs
块,而不是通过该方法的更好的一行程序

你知道如何在没有保留周期的情况下使用oneliner吗?

好的,因此由Jakub Vano链接是很好的,但它不是很通用的。它限制您使用没有参数且返回
Void
的函数。使用Swift泛型,我们可以更聪明地使用接受任何参数和使用任何返回类型的函数

因此,第一件事是,对于
弱的
关系,必须使用对象。无法弱引用结构。因此,我们将实例类型约束为
AnyObject
,这是所有类都遵守的协议。我们的函数声明如下所示:

func applyWeakly<Type: AnyObject, Parameters, ReturnValue>(instance: Type, function: (Type -> Parameters -> ReturnValue)) -> (Parameters -> ReturnValue?)
func applyWeakly(实例:类型,函数:(类型->参数->返回值))->(参数->返回值?)
因此,该函数获取一个实例,以及一个获取实例并返回
Parameters->ReturnValue
函数的函数。记住,Swift中的闭包和函数是可互换的。干净利落

请注意,我们必须返回一个可选的
ReturnValue
,因为实例可能变成
nil
。我将在稍后讨论如何解决这个问题


好的,现在你需要知道一个非常巧妙的技巧:,它非常适合我们的需要,我认为这有点反模式:RAC的优点之一是从回调转移到更简洁的代码,而这里你做的恰恰相反。完全同意,但是,我发现自己在多个位置使用回调。传递方法有时是有意义的,尽管我在这里给出的示例非常糟糕。例如,映射方法是我在信号之间共享的东西。好的,这种重用对我来说也是有意义的。你看到这里提出的解决方案了吗?由@JakubVano链接的答案看起来非常感谢Ash,我不希望有更好的澄清答案!这似乎是我想要实现的目标的最佳解决方案,尽管我不确定这是否会让事情变得更可读、更好,而只是写下结束语(以我为例)。我将在未来的实现中使用您的示例,并将检查什么最适合。谢谢