Source Kit Service Terminated 报错

我在 Xcode 中遇到了一个问题,报错 “Source Kit Service Terminated”,接着 Swift 中的语法高亮显示和代码自动提示都消失了。如何解决这个问题?

下面是一个示例图像:

enter image description here

42267 次浏览

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

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

在项目中使用Swift以外的其他名称。“Swift”是保留的。

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

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

    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)
}

在我的spritekit项目中插入touchesMoved-function后,这种情况开始发生。这个函数使用强制展开,这似乎导致了问题:

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

在删除感叹号并停止强制打开后,SourceKitService停止了崩溃。

希望这能有所帮助!

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


我的症状是:

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

调试过程:

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

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

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

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

更漫长和复杂的过程。 (前3步不一定有帮助,但我做了,所以记录在这里)

  1. 完全删除系统上的所有Xcode副本。
  2. 重新启动计算机。
  3. 只能重新安装Xcode6-beta。
  4. 确认在操场和/或项目中仍然存在问题。
  5. 打开iOS模拟器。
  6. 硬件→设备→管理设备
  7. 移除所有设备。
  8. 重新创建您想要的所有设备。我在名字后面加上了iOS版本,只是因为。
  9. 重新启动Xcode和模拟器。
  10. 验证至少游乐场不再抛出问题时,从OS X切换到iOS
  11. 打开项目并将目标的部署目标更改为<= 7.1。

分析

看来问题是Xcode6不能正确地找到并连接到模拟器。我不知道为什么会出现这种情况,但这让我可以继续使用Swift进行开发。这可能与模拟器二进制文件似乎移动了. exe有关。

报告给苹果公司(#17266321):

细节:

< p >概要: 如果我们试图将值作为数组打印一个字典,则弹出窗口会不断弹出-“SourceKit terminated.”编辑器功能暂时受限”。Xcode冻结并失去上下文识别,导致文本变黑

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

.
  1. 创建一个字典as -"var MacOSYosemiteFeatures: dictionary = ["Device":iOSHistoryArray]"。

  2. 将字典打印为- "println("包含数组值的字典:%@ \n",MacOSYosemiteFeatures)"< >强(& lt; & lt -罪魁祸首——> >)< / >强

  3. 第3步导致了注释问题,这使得Xcode再次起作用。

< p >预期结果: Xcode应该正常工作 实际结果:< p > Xcode变得无功能,失去上下文识别(所有字体丢失,所有文本变成纯黑色),整个Xcode变成Inactive < p >版本: 版本6.0 (6A215l)

一个只包含这两行的程序(在Swift语法方面可能是错误的)足以导致“SourceKitService Terminated”错误:

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

使用let而不是var可以使编辑器再次正常工作。Xcode 6.0版本(6A215l)

今天也有同样的问题,事情是与println,我只是尝试了旧的NSLog样式打印一个值:

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

我们应该如何在swift中组成字符串的方式已经从printf风格演变为内联风格,所以现在你可以像这样将你的值嵌入到格式字符串中:

"Here goes \(YOUR_VARIABLE)"

所以,对于上面的例子,解决方案是:

println("value =\(valueObj)")

试一试:

在Swift编译器/索引器中有一个错误。有几条线 你的代码给它带来了困难。您必须编辑您的代码 使用其他文本编辑器注释掉有问题的行 然后你才能用Xcode打开这个项目。如果你有 不知道问题是什么,注释掉你所有的代码。一旦你有了 项目打开后,您可以开始一点一点地带回代码 直到CPU活动的增加告诉您已经找到了 问题。< / p >

我在Xcode6 beta 3中创建了一个在beta 2中创建的项目,遇到了同样的问题。

这是因为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产生的。

解决方案,直到bug被修复:手动检查错误:)

古德勒克!

我在苹果的开发者论坛上找到了<强> < / >强的解决方案(这需要登录,所以我也会在这里解释它)。

TLDR:不要在Objective-C to Swift桥接头中导入与@interface同名的@protocol。例如,Facebook SDK有一个名为“FBGraphObject”的协议和接口。

以下是论坛帖子:

添加Facebook SDK会导致SourceKitService崩溃。如果你想使用beta 3,你需要Facebook SDK,我发现的一个工作是重构Facebook SDK的@protocol FBGraphObject,并将其重命名为@protocol FBGraphObjectProtocol作为@interface FBGraphObject也存在,显然SourceKit不喜欢它。

这当然是一个临时的解决方案,只是为了让你的功能,你必须使用Cocoapods或以其他方式构建Facebook SDK,而不是使用框架库。

目前,您需要确保没有冲突的@protocol和@interface声明,其中包括您可能使用的第三方库。

这让我今天付出了代价,希望它能有所帮助!


e.parto2014年7月10日上发布

问题:

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

我的案例:安装beta 3, OSX仅项目,一个文件检测到“半封闭范围操作符已从..To .<"错误。弹出窗口开始出现,代码高亮显示开始失败。

解决方案:

  • 修复Xcode检测到的错误
  • 在Navigator中更改为不同的.swift,回到原来的
  • 语法高亮显示重新出现,“SourceKitService Terminated”弹出

在Xcode 6 Beta 3中,我每隔几秒钟就会遇到这个问题,甚至在全新的项目中,这个问题仍然存在。我将部署目标从8.0更改为7.1,它已经停止。

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

具有:http://www.reddit.com/r/swift/comments/2bznfo/error_running_playground_unable_to_find_suitable/

我的解决方案是更换模拟器。我使用的是iPhone 5S,当我切换到iPhone 5时,一切都很完美。希望未来的版本能完全修复它。

只要我输入,SourceKitService就会在我的系统上崩溃

extension foo {

我使用的是Xcode 6 beta 6,不管我是把它输入到一个空文件中,还是把它添加到一个现有的文件中。只要源代码包含一个extension块,它就会崩溃。即使在新创建的项目中也会发生这种情况。

我的“解决方案”是避免在我目前正在开发的源代码中进行扩展。我注释掉了类块的结尾和扩展块的开头。我一完成这门课的工作,就会再次对它们进行评论:

class MyClass {


[... my stuff ...]


//}
//
//extension MyClass {


}

在我的情况下,我已经导入桥接头丢失的文件。在我删除错误导入后,错误通知消失了。

我在嵌套的objective - c++项目中也犯了同样的错误,该项目现在包含了带有Swift代码的框架。为了解决这个问题,我必须明确地构建框架。一旦我做了,那期就没了,再也不会回来了;)

我的答案(Xcode6-Beta7)是简单地删除派生数据文件夹。

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

希望这能帮助到一些人。很明显,这种崩溃的发生有很多原因。

xcode 6 Version 6.0 (6A313)仍然存在

  • 创建一个新项目
  • 添加一个框架图书馆
  • 选择cocoa触摸框架
  • 添加Swift文件
  • 向swift文件中添加一个类

崩溃

Ps:全新的MAC mini,没有之前的xcode安装,没有任何异国情调。我想只是个测试版产品。

Xcode 6.1 Beta 3:

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

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

public class DummyClass {
public typealias Foo = String
}

像这样使用它:

var myVar:DummyClass.Foo?

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

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

defaults delete com.apple.dt.Xcode

这将把Xcode恢复到默认设置。打开Xcode,一切都可以正常工作了。

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

它位于:/Users/{用户名}/Library/Developer/Xcode/DerivedData/{项目名}-{随机字符序列}

我希望这能有所帮助。

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

  • 行末的分号
  • 导入文件中未引用的框架

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

在我的例子中,我通过桥接头导入Objective-C文件,桥接头具有以下true之一:

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

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

供您参考-如果您需要设置没有实现(.m)文件的头(.h)文件的目标,您可以遵循以下简单的步骤

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

例如,这是错误的:

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

这是可以的:

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

你只需要删除“ModuleCache”,这是Xcode用于自动补全的某种缓存。

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

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

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

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

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

编辑:根据@Portland Runner:

类似地,如果将返回类型设置为func名称,则会得到错误。

func foo() ->foo{}

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

extension SomeType {
// new functionality to add

在过去的几个月里,我几乎每天都有这种感觉。尝试了上面所有的方法,它只能暂时修复它。

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

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

希望这能帮助到一些人。

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项目总是很快。所以可能有很多工作要做。经验告诉我们哪些表达是复杂且耗时的。如果你能对这些事情进行基准测试,那就太好了。