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

Swift类引用协议触发Xcode错误,需跨视图控制器调用协议方法

解决SecondViewController调用FirstViewController中createEvent方法的问题

看起来你在尝试用协议实现ViewController间的通信,但在声明协议属性和调用方法时踩了几个坑,我来一步步帮你理清:

第一步:修正协议,使其支持类绑定

首先,你的SharedFunctions协议需要标记为类绑定,这样才能用weak修饰属性(避免循环引用,因为UIViewController都是类实例)。修改协议:

protocol SharedFunctions: AnyObject { // 加上AnyObject,限制只能类遵守
    func createEvent(event: Event, text: String)
}

第二步:在SecondViewController中正确声明代理属性

你之前的错误在于把属性声明成了协议的元类型(.self),但我们需要的是遵守该协议的实例引用。正确写法:

class SecondViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
    // 用weak修饰,避免循环引用;类型是可选的SharedFunctions实例
    weak var sharedDelegate: SharedFunctions? 

    @IBAction func postChatMessageAction(_ sender: Any) {
        // 先判断event和代理是否存在,防止崩溃
        guard let targetEvent = event, let delegate = sharedDelegate else {
            print("Event或代理未初始化")
            return
        }
        // 调用代理方法
        delegate.createEvent(event: targetEvent, text: "New Event")
    }
    // ... 其他代码
}

第三步:在跳转时设置代理

当从FirstViewController跳转到SecondViewController时,需要把FirstViewController实例赋值给SecondVC的sharedDelegate。比如通过segue跳转的场景:

class FirstViewController: UITableViewController {
    // ... 其他代码
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if let secondVC = segue.destination as? SecondViewController {
            // 把当前FirstVC实例设置为SecondVC的代理
            secondVC.sharedDelegate = self
        }
    }
}

为什么之前的写法会报错?

  • var sharedFunctions = SharedFunctions?:语法错误,协议不能直接这样声明属性,正确的是声明为SharedFunctions?类型的属性(不需要等号)。
  • SharedFunctions?.self:这是协议的元类型(代表类型本身),而我们需要的是遵守协议的实例,所以调用不了实例方法createEvent。
  • weak var delegate = SharedFunctions?:因为原协议没有标记为类绑定(AnyObject),weak只能用于类类型,所以报错。加上AnyObject后,协议就只能被类遵守,weak修饰就合法了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:41:33