Xcode Beta 6.1和Xcode 6 GM因奇怪的原因卡在索引上

5

我正在开发一款Swift应用程序,其中在某个时刻我有一个类似于以下代码的代码:

 import UIKit

class ViewController: UIViewController {
    private var a: UIImageView!
    private var b: UIImageView!
    private var c: UILabel!
    private var d: UILabel!
    private var e: UILabel!
    private var f: UILabel!
    private var g: UIView!
    private var h: UIView!
    private var i: UIView!
    private var j: UIView!
    private var k: UIImageView!
    private var l: UIView!
    private var m: UIView!
    private var n: UIView!
    private var o: UIView!
    private var p: UIScrollView!
    private var q: UIView!

    override func viewDidLoad() {
        super.viewDidLoad()

        let viewBindingsDict = ["a" : a,
            "b" : b,
            "c" : c,
            "d" : d,
            "e" : e,
            "f" : f,
            "g" : g,
            "h" : h,
            "i" : i,
            "j" : j,
            "k" : k,
            "l" : l,
            "m" : m,
            "n" : n,
            "o" : o,
            "p" : p]
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

由于某种原因,当我加入这段代码后,Xcode就会卡住,我什么都做不了。
打开Activity Monitor,它显示sourcekitservice和swift占用超过100%的CPU。
我已经使用以上代码创建了一个示例项目:https://dl.dropboxusercontent.com/u/1393279/aaaaaaa.zip 我已经尝试过清除派生数据、重新安装Xcode、重新启动、等待几分钟等方法,但它仍然无法正常工作。

我曾经使用过各种Xcode 6的测试版,有时会在索引上卡15秒左右。偶尔我会感到烦恼,停止任务并再次尝试,以便立即正常工作。我还没有在GM种子版本中遇到这个问题(但也许会出现)。顺便说一句,“Xcode Beta 6.1”这个标题是什么意思?Xcode 6.1还不存在啊。 - DBD
2
是的,有的:https://developer.apple.com/xcode/downloads/ - Wak
我的错误,我改正。 - DBD
2个回答

18

我遇到过类似的问题,我的解决方法是将长语句拆分成多行

我在 playground 中测试了你的代码,立刻发现 SourceKitService 进程占用了 100% 的 CPU。

在你的代码中,我看到最长的语句是字典的初始化。因此,首先可以采用一种方法使其可变,并且每行初始化短一些。

Swift 不提供字典的 += 运算符,因此我们首先需要一个(感谢@shucao):

func +=<K, V> (inout left: Dictionary<K, V>, right: Dictionary<K, V>) -> Dictionary<K, V> {
    for (k, v) in right {
        left.updateValue(v, forKey: k)
    }
    return left
}

有了这个工具,您可以按以下方式初始化字典:

var viewBindingsDict = ["a" : a, "b" : b, "c" : c, "d" : d, "e" : e]
viewBindingsDict += ["f" : f, "g" : g, "h" : h, "i" : i, "j" : j]
viewBindingsDict += ["k" : k, "l" : l, "m" : m, "n" : n, "o" : o]
viewBindingsDict += ["p" : p]

每行最多选择5个项目。

但是在您的代码中,您将字典声明为不可变的 - Swift没有提供任何语句来在声明后初始化不可变对象 - 幸运的是,我们可以使用闭包来实现:

let viewBindingsDict = { () -> [String:UIView] in
    var bindings = ["a" : self.a, "b" : self.b, "c" : self.c, "d" : self.d, "e": self.e]
    bindings += ["f": self.f, "g" : self.g, "h" : self.h, "i" : self.i, "j" : self.j]
    bindings += ["k" : self.k, "l" : self.l, "m" : self.m, "n" : self.n,  "o" : self.o]
    bindings += ["p": self.p]
    return bindings
}()

3
好的,我会尽力为您翻译。以下是翻译的内容:做得好。谢谢。我第一次见到这样的东西。显然,Swift 还没有准备好投入生产。 - Wak
1
这个问题在XCode 6.0.1中修复了吗?我仍然遇到这个问题。 - zeeple
2
当我迁移到Xcode 6.1时,我遇到了类似的问题。我定义了一个由字典列表组成的列表菜单,例如private let menuData = [[<<所有我的定义>>]] ,大约需要35行代码。在“Indexing | Compiling swift code”阶段,Xcode卡死,CPU处于100%的状态,进程为swift。通过动态添加菜单的小部分来解决!我想我也可以使用Plist,但这不是重点。 - Francois Robert

2

我曾经遇到过同样的问题。删除预编译头文件和派生数据似乎解决了它。我不确定这是否会永久解决问题,但至少现在它是有效的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接