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

下面是一个示例图像:


当前回答

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

其他回答

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

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

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

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

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

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

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

编辑:根据@Portland Runner:

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

func foo() ->foo{}

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