You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)
    }
}

核心逻辑说明

  1. 双向绑定:Request创建Controller后,将Controller的onRequest闭包赋值给自身的onResult,当actionPerform变化时,onResult触发,进而调用Controller的回调。
  2. 保留回调逻辑:Controller不再覆盖外部传入的回调,而是组合日志逻辑后调用原始回调,确保外部传递的逻辑生效。
  3. 协议一致性:修正协议方法的返回值,解决编译错误,保证代码合法性。

内容的提问来源于stack exchange,提问作者User Unknown

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 15:40:28