我在Xcode中遇到了一个问题,错误“源套件服务终止”正在弹出,所有语法高亮显示和代码完成都在Swift中消失了。我该如何解决这个问题?

下面是一个示例图像:


当前回答

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

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

一些简单的例子:

字典

Bad:

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

好:

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

最好的:

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

映射

Bad:

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

其他回答

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

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

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

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

希望这能有所帮助!

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

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

崩溃

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

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

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

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

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

编辑:根据@Portland Runner:

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

func foo() ->foo{}