Xcode 9.3中‘Jump to definition’显示同一符号多选项的原因?
我之前也碰到过Xcode这个烦人的问题,结合实际排查经验和社区常见情况,大概率是下面这些原因导致的:
项目索引损坏:Xcode的索引系统是跳转功能的核心,如果索引文件损坏,就会出现识别混乱,把同一个目标当成多个选项。
解决办法:打开Xcode,点击顶部菜单File > Workspace Settings(如果是项目就选Project Settings),找到Derived Data区域,点击Delete按钮清除派生数据,然后重启Xcode,它会重新构建索引。项目中存在重复的符号定义:比如你可能在不同的文件里给同一个类加了同名的
extension(扩展),或者引入的第三方框架里有和你项目类名重复的符号,甚至是不小心复制了同一文件到项目的不同目录,Xcode索引时会把这些都当成独立的目标,但实际指向同一实现。
解决办法:全局搜索你的类名/函数名,看看有没有重复的定义或者重复的文件引用,把多余的删除或者重命名区分开。框架引用方式问题:如果你的项目同时通过
CocoaPods和手动方式引入了同一个框架,或者框架本身的内部结构有重复的符号导出,也会导致Xcode识别出多个“假目标”。
解决办法:检查Podfile和项目的Linked Frameworks and Libraries,确保同一个框架只通过一种方式引入,然后重新执行pod install并清理派生数据。Xcode版本的已知bug:Xcode 9.3本身确实存在一些索引相关的小bug,尤其是在处理复杂项目或者混合语言(比如Swift+OC)项目时,容易出现这种识别混乱的情况。
解决办法:如果上面的方法都没用,可以尝试升级到Xcode 9.x的后续小版本(比如9.4.1),或者如果项目允许,直接升级到更高大版本的Xcode,这类bug在后续版本里大多被修复了。
另外你提到新建项目没有这个问题,也侧面印证了是当前项目的配置/索引/符号重复问题,而不是Xcode的全局设置问题,优先从项目本身的排查入手会更快解决。
内容的提问来源于stack exchange,提问作者Jared

