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

Swift协议与委托多类反向传值失败:回调函数无法触发?

问题原因及修复方案

核心问题

你代码里的两个ThirdClass实例是完全独立的:

  • ViewController中初始化的thirdClass设置了delegate为当前VC,但这个实例根本没被用来执行multiplyNumbersByTwo方法。
  • SecondClass内部新创建的ThirdClass实例才是实际计算的那个,但它的delegate一直是nil,所以printNumber回调自然不会触发。

修复方案

让SecondClass使用ViewController中已经配置好delegate的ThirdClass实例,而不是自己新建一个。具体修改如下:

修正后的ViewController代码

class ViewController: UIViewController, PostNumber {
    func printNumber(number: Int) {
        print("Number is \(number)")
    }
    override func viewDidLoad() {
        super.viewDidLoad()
        let thirdClass = ThirdClass()
        thirdClass.delegate = self
        
        let secondClass = SecondClass()
        // 把配置好delegate的ThirdClass实例传给SecondClass
        secondClass.addNumbers(firstNumber: 10, secondNumber: 5, with: thirdClass)
    }
}

修正后的SecondClass代码

class SecondClass {
    func addNumbers(firstNumber: Int, secondNumber: Int, with thirdClass: ThirdClass) {
        let sum = firstNumber + secondNumber
        thirdClass.multiplyNumbersByTwo(number: sum)
    }
}

ThirdClass代码保持不变

protocol PostNumber {
    func printNumber(number: Int)
}
class ThirdClass {
    var delegate: PostNumber?
    func multiplyNumbersByTwo(number: Int) {
        let result = number * 2
        print("test")
        delegate?.printNumber(number: result)
    }
}

这样修改后,SecondClass调用的是同一个配置好delegate的ThirdClass实例,回调函数就能正常触发了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 02:45:16