Xcode 9.2反复弹出“是否添加协议存根”提示,求助解决方法
嘿,我来帮你排查这个头疼的问题!Xcode一直弹这个提示,核心原因是它认定你还没实现协议要求的必须方法,要么是实现的方法有细节错误,要么是协议关联出了问题。结合你的场景,我整理了几个关键排查方向:
检查协议方法的签名是否完全匹配
不管是你自定义的可展开协议,还是第三方库提供的,一定要保证你写的方法在方法名、参数类型、返回值、甚至参数标签上和协议定义的丝毫不差。举个例子,如果协议定义是:protocol ExpandableTableViewDelegate: UITableViewDelegate { func tableView(_ tableView: UITableView, shouldExpandRowAt indexPath: IndexPath) -> Bool func tableView(_ tableView: UITableView, didExpandRowAt indexPath: IndexPath) }那你实现时不能把参数标签
_ tableView改成tableView,也不能把indexPath换成Int类型的索引——哪怕只是一点点差异,Xcode都识别不出来,会默认你没实现这个方法。确认你的扩展确实绑定了目标协议
从你给出的代码片段看,当前MenuController只声明遵守了MFMailComposeViewControllerDelegate,而你说的“可展开delegate协议”是不是没正确关联?比如你的扩展应该写成这样:extension MenuController: ExpandableTableViewDelegate { // 这里放协议要求的所有必须方法 }如果是你自定义的协议,还要确保协议的作用域是当前文件可见的(比如不要加不必要的
private修饰),不然Xcode可能找不到协议的方法要求。清理Xcode缓存,重启项目
Xcode 9.2确实存在一些老版本的缓存bug,有时候会导致它误判协议的实现状态。你可以先按Cmd + Shift + K清理Build文件夹,然后完全退出Xcode,重新打开项目再试试,大概率能解决一些莫名其妙的提示问题。检查是否遗漏了协议的必须方法
有时候点击“Fix It”时,Xcode可能只帮你添加了第一个必须方法,剩下的没加全。你可以手动去协议的定义里看看,所有没有optional修饰的方法,都必须一一实现,不能遗漏。
内容的提问来源于stack exchange,提问作者Chandni

