Xcode 7.3 Swift 的语法突出显示和代码完成问题

Xcode 7.3 Syntax Highlighting and Code Completion issues with Swift

我在使用 XCode 7.3(但是,自从我安装了 XCode 7.2 之后这个问题一直存在)和 Swift 代码中遇到了一个非常令人沮丧的问题,我希望其他人有有这个问题并且知道如何解决它。语法突出显示和代码完成在 Objective-C 文件中工作得很好,在 Swift 代码中调用其他 Swift 对象时也能正常工作。但是,Swift 代码中提到的任何 Objective-C 对象或方法都不会突出显示语法,并且 XCode 不会完成任何 Objective-C 声明的方法或属性。一切编译和运行都很好。

我还应该补充一点,我也尝试过对 XCode 进行完全干净的安装。我删除了所有派生数据,删除了所有 XCode 缓存,并删除了我的 XCode 首选项文件(除了在重新安装之前明显删除 XCode.app 存档)。

这使得在 Swift 中开发变得极其困难。我不想这样做,但如果我找不到解决这个问题的方法,我将被迫重新使用 Objective-C.

我也遇到了同样的问题。不过最后还是解决了。 我改了两处,不知道哪个是重点,大家可以试试。

  1. 删除模块缓存

Within the same folder as your project's Derived Data is a Module Cache. When Code Completion stopped working, deleting this fixed it.

Close Xcode and delete the ~/Library/Developer/Xcode/DerivedData/ModuleCache directory.

  1. 更改启用模块值

Go to the Build Settings of your target, then search Enable Modules

If it's Yes, change it to No, and you may get some build error, just change it back to Yes.

完成上述两个步骤后,您应该清理(Shift+Command+K)您的项目。

现在您可能已经解决了问题。

我们在混合 ObjC/Swift 项目中遇到了同样的问题。尝试了有关删除派生数据等的所有建议,但无济于事。有时它有帮助,但不是以可重现的方式,一段时间后它停止工作。 Galvin 在这个 post 中的 post 让我走上了与模块相关的构建设置的轨道。然而,这是另一个以可重现的方式解决代码 completion/coloring 的设置:将我们的主要项目的 DEFINES_MODULE(在打包下)从 YES 设置为 NO 是解决方案。

备注:

看来问题出在 CocoaPods 上。我将 Cocoapods 用作静态库而不是框架。切换到框架(在我的 Podfile 中使用 use_frameworks!)并将库导入 Swift 已经解决了我所有的问题。我猜所有这些第三方库 headers 对 XCode 来说处理起来太多了。无论哪种方式,问题现在都已解决。我希望这对以后的人有所帮助。

这可能不再需要了,但我仍然想 post 这个:

在 post 时,最新版本的 cocoapods (1.0.0.beta.8) 要求您为每个 pods 定义 Xcode 目标.

在我的例子中,我对项目目标和测试目标进行了 class 编译。由于懒惰,我只在主要目标上添加了一个 pod。

现在在 class A 的代码中工作,我使用 import NAME 添加了 pod 框架,并尝试使用框架的 classes。 Xcode 不会突出显示我使用新 classes 的特定代码,但编译和 运行 工作正常。在完成对话框中,变量的类型是 <<error type>>

解决方法:在Podfile中将新添加的pod添加到所有targets中,classA是member.

现在 Xcode 为所有目标找到了必要的框架,并且代码突出显示再次起作用。

编辑 1:

一个可能的解决方案是定义一个共享列表 pods,就像我的例子:

platform :ios, '8.4'
use_frameworks!
inhibit_all_warnings!

def all_pods
    pod 'MPMessagePack'
    pod 'SwiftyDispatch'
    pod 'BFKit'
    pod 'Timepiece'
    pod 'Alamofire'
    pod 'AlamofireSwiftyJSON'
end

def testing_pods
    pod 'Quick'
    pod 'Nimble'
end

target 'App' do
    all_pods
end

target 'AppLogicTests' do
    all_pods
    testing_pods
end

target 'AppUITests' do
    pod 'RxTest'
    all_pods
    testing_pods
end

post_install do |installer|
    installer.pods_project.targets.each do |target|
        puts target.name
    end
end

这会将所有 pods 添加到所有目标并将所有测试 pods 添加到目标。在这些旁边,我将 'RxTest' 添加到 AppUITests。

(选择 pods 是我的项目示例,无广告目的:-))

如果上述 none 适合您 并且您正在使用 Cocoapods,您可以尝试切换到 Carthage。

我尝试了在 Google 上找到的所有建议,但都无济于事。但一直以来,Cocoapods 似乎都是许多黑客试图修复它的原因。我一直在阅读 Carthage,以及它如何不修改您的项目,强制您使用工作区,或者可能用头文件填充您的构建文件夹(这会混淆 Xcode 并可能导致语法突出显示和自动完成打破)。

进行切换后,我还没有 运行 遇到任何问题,老实说,我更喜欢少量的开销来获得一个干净的解决方案。 This post 真的帮我把它带回家了。