242

I am having a issue with Xcode where the error "Source Kit Service Terminated" is popping up and all syntax highlighting and code completion is gone in Swift. How can I fix this?

Here is an example image:

enter image description here

4

34 回答 34

114

我的答案(Xcode6-Beta7)只是删除 Derived Data 文件夹。

Preferences > Locations > Derived Data > click the arrow to open in Finder > trash it.

希望这可以帮助某人。很明显,发生这种崩溃的原因有很多。

于 2014-09-15T01:27:51.593 回答
35

我相信我可能已经找到了一个更通用的解决方案。以下是我用来鼓励 Xcode 不要产生SourceKitService Terminated错误的步骤。


我遇到的症状:

  • 当我要启动一个新的 Playground 时,我会收到一个关于无法与 Playground 通信的错误消息(Error running playground: Failed prepare for communication with playground.请参阅twitter 上的这张图片
  • 当我将操场从 切换OS X到 时iOS,我会收到另一个错误(不幸的是我没有写下那个错误)。
  • 当我开始输入基于 iOS 的 Swift 项目,尝试在任何 UIKit 特定类上使用代码完成/智能感知时,我会SourceKitService Terminated在这个线程中收到问题。

调试过程:

  • 我开始通过谷歌查找 SourceKitService,得到的很少。
  • 然后我在使用 Xcode 时开始监控 Console.app。这显示了几个错误:
    • IDEPlaygroundDocument: Error encountered running playground
    • com.apple.CoreSimulator.CoreSimulatorService[3952]: The runtime for the selected device is not installed.

我做了什么来纠正这个问题。

如果您只是在 Swift 项目的上下文中遇到问题,请先单独尝试。如果这不起作用,请尝试以下所有步骤。

  1. 打开您的项目并将目标的部署目标更改为 <= 7.1。

更冗长和复杂的过程。(前三个步骤肯定没有帮助,但我做了,所以在这里记录它们)

  1. 完全删除系统上的所有 Xcode 副本。
  2. 重启你的电脑。
  3. 仅重新安装 Xcode6-beta。
  4. 验证您在操场和/或项目中仍然存在问题。
  5. 打开 iOS 模拟器。
  6. 硬件 -> 设备 -> 管理设备
  7. 移除所有设备。
  8. 重新创建您想要的所有设备。我将 iOS 版本附加到名称的末尾,只是因为。
  9. 重启 Xcode 和模拟器。
  10. 验证至少 Playgrounds 在OS XiOS.
  11. 打开您的项目并将目标的部署目标更改为 <= 7.1。

分析

看来问题在于 Xcode6 无法正确找到并连接到模拟器。我无法确定为什么会这样,但这让我可以继续使用 Swift 进行开发。这可能与模拟器二进制文件似乎已移动的事实有关。

于 2014-06-09T01:28:10.007 回答
32

您只需要删除“ModuleCache”,这是 Xcode 用于自动完成的某种缓存。

在终端中复制并粘贴以下行:

rm -rf ~/Library/Developer/Xcode/DerivedData/ModuleCache

于 2014-10-30T08:51:41.920 回答
27

SourceKitService 在我输入后立即在我的系统上崩溃

extension foo {

我正在使用 Xcode 6 beta 6,我将它输入到一个空文件中或将其添加到现有文件中都没有关系。一旦源包含一个extension块,它就会崩溃。即使在新创建的项目上也会发生这种情况。

我的“解决方案”是避免扩展我目前正在处理的资源。我注释掉类块的结尾和扩展块的开头。一旦我完成了课堂作业,我再次评论他们:

class MyClass {

    [... my stuff ...]

//}
//
//extension MyClass {

}
于 2014-08-20T00:12:24.890 回答
9

插入 touchesMoved 函数后,它开始在我的 spritekit 项目中发生。此函数使用强制展开,这似乎会导致问题:

override func touchesMoved(touches: NSSet!, withEvent event: UIEvent!)

在删除感叹号并因此停止强制展开后,SourceKitService 停止崩溃。

希望这可以帮助!

于 2014-06-07T13:52:35.783 回答
9

我在 Apple 的开发者论坛上找到了一个解决方案(需要登录,所以我也会在这里解释)。

TLDR:不要@protocol将 Objective-C 中的 a 导入与@interface. 例如,Facebook SDK 有一个名为“FBGraphObject”的协议和一个接口。

以下是论坛帖子:

添加 Facebook SDK 会导致 SourceKitService 崩溃。如果您想使用 beta 3 并且需要 Facebook SDK,我发现并为我工作的一项解决方法是重构 Facebook SDK 的 @protocol FBGraphObject 并将其重命名为 @protocol FBGraphObjectProtocol 之类的东西,因为 @interface FBGraphObject 也存在,显然是 SourceKit不喜欢它。

它肯定是一个临时解决方案,只是为了让您保持功能,您必须使用 Cocoapods 或以其他方式自己构建 Facebook SDK,而不是使用框架库。

目前,您需要确保没有冲突的 @protocol 和 @interface 声明,并且包括您可能正在使用的 3rd 方库。

今天花了我很多钱,希望对您有帮助!


e.parto于2014年7 月 10 日发布

于 2014-07-11T01:05:51.467 回答
8

我在 Xcode 6 Beta 3 中每隔几秒就会遇到一次这个问题,甚至在全新的项目中它也会继续出现。我将部署目标从 8.0 更改为 7.1,但它已停止。

于 2014-07-20T08:46:31.827 回答
8

为项目使用 Swift 以外的其他名称。“斯威夫特”是保留的。

于 2014-06-03T08:30:24.453 回答
5

你的项目有名字Swift吗?看到该消息,构建也会失败(<unknown>:0: error: module name "Swift" is reserved for the standard library)。尝试使用另一个项目名称,例如SwiftTest. 它会起作用的。

于 2014-06-03T08:01:55.477 回答
3

如果 Xcode 已打开,请退出它。然后从终端运行:

defaults delete com.apple.dt.Xcode

这会将 Xcode 恢复为默认设置。打开 Xcode,一切都应该再次运行。

于 2014-10-15T14:40:11.333 回答
3

为了解决这个问题,您的 Swift 代码可能会遇到一些奇怪的问题。例如,有多个 IBOutlets 定义,因为您正在复制和粘贴。通常它只是一个无法处理的语法错误。

于 2014-06-03T02:29:34.400 回答
3

我发现通过显式(静态)输入变量类型,而不是推断它们,为我解决了这个问题。

于 2014-06-05T03:06:15.157 回答
2

对我来说(xcode 6.1)的原因是我忘记采用我的子类来协议。

例如这是错误的:

protocol SomeProtocol { ... }
class A :NSObject, SomeProtocol {
...
}
class B : A {
...
}

这没关系:

protocol SomeProtocol { ... }
class A : NSObject, SomeProtocol {
...
}
class B : A, SomeProtocol {
...
}
于 2014-10-24T12:23:28.863 回答
1

我发现从终端中删除派生数据可以解决问题,直到下一次崩溃。:S

它位于:/Users/{User name}/Library/Developer/Xcode/DerivedData/{Project Name}-{Random char sequence}

我希望这有帮助。

于 2014-10-19T06:58:47.543 回答
1

仅由这两行组成的程序(在 Swift 语法方面可能是错误的)足以在此处导致“SourceKitService Terminated”错误:

var x = 42
println("Hello", x)

使用let而不是var使编辑器再次正常运行。Xcode 版本 6.0 (6A215l)

于 2014-06-13T22:46:00.350 回答
1

我想我找到了一个(可能有很多)发生这种情况的原因。

在我的情况下,我通过桥接头导入 Objective-C 文件,该文件具有以下条件之一:

  1. Objective-C 导入的实现文件 (.m) 没有正确设置应用程序目标。
  2. Objective-C 文件只有一个头文件 (.h) 而不是一个实现 (.m) 文件。(同样,我认为这是“没有适当的应用程序目标”集的一部分,因为您只能在 .m 文件中设置目标,而不能在 .h 文件中设置目标)

修复 Objective-C 文件上的应用程序目标或删除桥接头中这些文件的导入似乎可以解决问题。

仅供参考 - 如果您需要设置没有实现 (.m) 文件的头 (.h) 文件的目标,您可以按照以下简单步骤操作:无法在 Xcode 4.5 中更改目标成员资格可见性

于 2014-10-22T21:53:09.563 回答
1

只是为了在这里添加一个更多潜在的解决方案,我不小心将一个类 var 命名为与其类型相同的名称:

class var Settings:Settings {
        get { return classVarWorkAround.settings }
    }

这肯定会使 SourceKit 崩溃。愚蠢的语法错误,但以防其他人犯同样的错误。

编辑:也根据@Portland Runner:

同样,如果您将返回类型设置为函数名称,您将收到错误消息。

func foo() ->foo{}
于 2015-01-26T14:15:01.957 回答
1

今天遇到了同样的问题,问题是println,我只是尝试了旧的 NSLog 样式来打印一个值:

// something like this
println("value = %@", valueObj)

我们应该如何在 swift 中编写字符串的方式已经从 printf 样式演变为 inline 样式,所以现在您将值直接嵌入到格式字符串中,如下所示:

"Here goes \(YOUR_VARIABLE)"

因此,对于上面的示例,解决方案是:

println("value =\(valueObj)")
于 2014-06-20T12:45:49.130 回答
1

对于在 beta 2 中创建的项目,我对 Xcode6 beta 3 有同样的问题。

这是因为 swift 语言(即数组声明语法)的新突破性变化。

检查由于 beta 3 中的重大更改而受影响的代码。

http://adcdownload.apple.com//Developer_Tools/xcode_6_beta_3_lpw27r/xcode_6_beta_3_release_notes__.pdf

我的例子之一是:

我不得不改变:

var tabBarController : UITabBarController = self.window?.rootViewController as UITabBarController;

var tabBarController : UITabBarController = self.window!.rootViewController as UITabBarController

结论:看起来如果源代码有错误,在某些情况下这个错误是由 Xcode 产生的。

修复错误之前的解决方案:手动检查错误:)

祝你好运!

于 2014-07-10T06:53:27.287 回答
1

我的解决方案恰好是更改模拟器。我的模拟器使用的是 iPhone 5S,当我将它切换到 iPhone 5 时,一切正常。希望未来的版本能够完全修复它。

于 2014-08-19T00:56:42.697 回答
0

问题:

  • 如果源代码有错误,可能会出现“SourceKitService Terminated”弹出窗口并且代码高亮停止工作。当它在多种不同的条件下发生时,它可能会发生也可能不会发生。

我的案例:安装了 beta 3,仅 OSX 项目,一个文件检测到“半封闭范围运算符已从 .. 更改为 ..<”错误。弹出窗口开始出现,代码突出显示开始失败。

解决方案:

  • 修复 Xcode 检测到的错误
  • 在 Navigator 中更改为不同的 .swift,回到原来的
  • 语法突出显示再次出现,“SourceKitService Terminated”弹出窗口消失了
于 2014-07-12T16:32:16.610 回答
0

试试看:

Swift 编译器/索引器中有一个错误。代码中的某些行或几行给它带来了困难。您必须使用其他文本编辑器编辑代码以注释掉有问题的行,然后才能使用 Xcode 打开该项目。如果您不知道问题出在哪里,请注释掉您的所有代码。一旦你打开了项目,你就可以开始一点一点地恢复代码,直到 CPU 活动的增加告诉你你已经找到了问题。

于 2014-06-27T08:06:37.433 回答
0

在 xcode 中,转到您的菜单栏 >> 窗口 >> 设备 (shift+cmd+2) 会弹出一个新窗口,并在左下方添加一个新模拟器,特别​​是在 iOS 8.0 上运行的模拟器到现有列表编辑:您可能需要重新启动 xcode

参考:http ://www.reddit.com/r/swift/comments/2bznfo/error_running_playground_unable_to_find_suitable/

于 2014-08-12T02:51:06.677 回答
0

当此错误开始弹出时,只需注释掉您编写的最后/最近的一段代码并等待一段时间。语法突出显示应该重新出现。这就是我解决问题的方法。

    func someFunc() -> (Int?, Int?, Int?) {
     var retVal1:Int? = nil
     var retVal2:Int? = nil
     var retVal3:Int? = nil

     //some other code

     //commenting out the line below helped me
     //(retVal1, retVal2, retVal3)
     return (retVal1, retVal2, retVal3)
    }
于 2014-06-07T05:00:30.657 回答
0

将扩展名移到主体类之前。

extension SomeType {
// new functionality to add 

}

于 2015-04-24T22:20:54.420 回答
0

就我而言,我在桥接标头中导入了丢失的文件。在我删除错误的导入后,错误通知消失了。

于 2014-08-21T11:10:33.800 回答
0

到目前为止,对我来说最常见的两个原因是:

  • 行尾的分号
  • 导入文件中未引用的框架
于 2014-10-22T00:15:39.510 回答
0

Xcode 6.1 测试版 3:

一旦您typealias Foo = Int在一个 Swift 文件中定义了非私有类型别名(例如 ),然后c在另一个文件中键入该字母,SourceKitService 就会崩溃。

解决方案是放弃使用类型别名,等待下一个 beta 版本或将类型别名包装在类定义中:

public class DummyClass {
    public typealias Foo = String
}

并像这样使用它:

var myVar:DummyClass.Foo?
于 2014-10-02T12:34:24.197 回答
0

向苹果报告(#17266321):

细节:

摘要:如果我们尝试将字典的值作为数组打印出来,则会弹出一个不断弹出的消息——“SourceKit 已终止。编辑器功能暂时受限”。Xcode 冻结并失去上下文识别,导致文本变黑。

重现步骤: 1. 创建一个数组为-"var iOSHistoryArray = ["iOS6","iOS7","iOS8",]"

  1. 创建字典为 -"var MacOSYosemiteFeatures:Dictionary = ["Device":iOSHistoryArray]"。

  2. 将字典打印为 - "println("Dictionary containing Array value : %@ \n",MacOSYosemiteFeatures)" (<<- Culprit-->>)

  3. 第 3 步会导致问题注释,从而使 Xcode 再次运行。

预期结果:Xcode 应该可以正常运行。

实际结果:Xcode 失去功能,失去上下文识别(所有字体丢失,所有文本变为纯黑色),整个 Xcode 变为非活动状态。

版本:6.0版(6A215l)

于 2014-06-11T09:51:08.460 回答
0

我在嵌套的 Objective-C++ 项目中遇到了同样的错误,该项目现在包含带有 Swift 代码的框架。为了解决这个问题,我必须明确构建框架。一旦我这样做了,这个问题就消失了,并且不会回来;)

于 2014-08-31T20:01:40.130 回答
0

xcode 6 版本 6.0 (6A313) 仍在发生

  • 创建一个新项目
  • 添加框架和库
  • 选择可可触摸框架
  • 添加一个 Swift 文件
  • 在 swift 文件中添加一个类

崩溃

ps:全新的mac mini,以前没有安装过xcode,没什么异国情调。我想只是一个测试版产品。

于 2014-09-17T19:48:26.960 回答
0

将部署目标更改为 iOS 8.0 对我有用。我知道有人说将它移到 <=7.1 有效,但这个问题似乎来自多个来源,所以这个替代方案可能有效。

于 2014-10-02T17:08:26.717 回答
0

在过去的几个月里,我几乎每天都会遇到这种情况。尝试了以上所有方法,它只是暂时修复它。

最后,两周前我将 DerivedData 位置的位置更改为一个新位置,并且我没有遇到过一次问题。

我注意到,当我删除派生数据文件夹时,它会重新生成,并且由于某种原因大约为 3GB。当我创建一个新文件夹时,它并没有重新生成所有这些数据。

希望这可以帮助某人。

于 2015-05-19T01:31:32.600 回答
0

Swift 试图找出什么是动态而不是静态的类型,但是当它处理复杂类型(如链式过滤器、映射、flatMap 调用)或大型字典时,这可能需要付出巨大的努力。有时您需要将它们分解以使编译器更容易分析。这个问题的一个表亲是“太复杂而无法及时评估”的错误。想象一下,有一些几乎太复杂而无法及时评估的东西:它们一起变成了资源消耗。

尝试找到所有创建动态字典或使用无类型调用链的地方。尝试更具体地键入,尤其是在变量的声明处。

一些简单的例子:

字典

坏的:

let myDict = [ /* bunch of different things */ ]

更好的:

let myDict: [String: AnyObject] = [ /* bunch of different things */ ] 

最好的:

let myDict: [String: SpecificType] = [ /* bunch of similar things */ ]

映射

坏的:

let filteredUserIds = users.filter({ user in user.enabled })
    .flatMap { user in user.name != nil ? return user.id : return nil }

更好的:

let filteredUserIds: [Int] = users.filter({ user in user.enabled })
    .flatMap { user in user.name != nil ? return user.id : return nil }

最好的:

let enabledUsers: [User] = users.filter { user in user.enabled } 
let filteredUserIds: [Int] = enabledUsers.flatMap { 
    user in user.name != nil ? return user.id : return nil 
}

好处还在于额外检查的代码,因为您总是会得到预期的类型或编译器错误。缺点是它开始看起来有点像 Java。

当然,随着项目的发展,这个问题首先会累积起来。小型 Swift 项目总是很快。所以可能工作量很大。经验告诉我们哪些表达方式复杂且耗时。如果您可以对这些事物进行基准测试,那就太好了。

于 2016-12-05T16:54:44.923 回答