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
相关产品推荐
相关产品推荐

