Swift中实现Request与Controller双向类交互的技术求助
问题分析与修复方案
你的双向交互失效核心是三个关键代码错误:
1. Controller 内部覆盖了传入的回调闭包
在Controller的初始化方法中,你先把外部传入的onRequest赋值给实例变量,紧接着又用新的闭包覆盖了它。这导致Request传递的回调逻辑完全被丢弃,自然无法收到通知。
2. Request 的 onResult 初始为 nil,未与 Controller 建立关联
你把onResult直接传给Factory创建Controller,但此时onResult是nil,没有绑定任何实际的回调逻辑,就算后续actionPerform变化,也没有可触发的闭包。
3. Factory 协议方法定义与实现不匹配
FactoryRequirement协议里的makeController没有返回值,但Factory类的实现却返回了Controller,这会导致编译错误,必须修正协议定义。
修正后的完整代码
Controller 修正
保留外部传入的回调闭包,若需要额外逻辑(比如日志),可以在传入的闭包内组合,而非直接覆盖:
class Controller { let displayScreen: UIViewController! let onRequest: ((Bool) -> Void)? init(displayScreen: UIViewController, onRequest: ((Bool) -> Void)?) { self.displayScreen = displayScreen // 保留外部传入的回调,同时添加日志逻辑 self.onRequest = { status in dlog("result \(status)", level: .assert) onRequest?(status) // 调用外部传入的原始回调(如果有的话) } } }
Factory/MiddleWare 修正
修正协议方法的返回值定义,与实现保持一致:
protocol FactoryRequirement { func makeController(displayScreen: UIViewController, onRequest: ((Bool) -> Void)?) -> Controller } class Factory: FactoryRequirement { func makeController(displayScreen: UIViewController, onRequest: ((Bool) -> Void)?) -> Controller { return Controller(displayScreen: displayScreen, onRequest: onRequest) } }
Request 修正
创建Controller时,传入绑定了Controller回调的闭包,并赋值给onResult,建立双向关联:
class Request: BaseArchetictureLayer { private var onResult: ((Bool) -> Void)? private var actionPerform = false { didSet { onResult?(actionPerform) } } let controllerFactory: Factory! init() { self.controllerFactory = Factory() } override func start() { let controller = controllerFactory.makeController( displayScreen: uiFromControllerToDisplay(), onRequest: { status in dlog("Controller received result: \(status)", level: .debug) } ) // 将Controller的回调绑定到Request的onResult,实现结果反向传递 self.onResult = { status in controller.onRequest?(status) } self.interactorListener = { [weak self] interact in self?.actionPerform = interact } self.perform(controller, animated: true) } }
核心逻辑说明
- 双向绑定:Request创建Controller后,将Controller的
onRequest闭包赋值给自身的onResult,当actionPerform变化时,onResult触发,进而调用Controller的回调。 - 保留回调逻辑:Controller不再覆盖外部传入的回调,而是组合日志逻辑后调用原始回调,确保外部传递的逻辑生效。
- 协议一致性:修正协议方法的返回值,解决编译错误,保证代码合法性。
内容的提问来源于stack exchange,提问作者User Unknown
相关产品推荐
相关产品推荐

