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

