Xcode Beta 6.1和Xcode 6 GM由于奇怪的原因而卡住了索引



我正在开发一个快速应用程序,在某个时候我有一个类似的代码:

 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会被卡住,我无法执行其他任何操作。

打开活动监视器,它显示sourcekitservice和使用超过100%CPU的swift。

我用上面的代码创建了这个示例项目:https://dl.dropboxusercontent.com/u/1393279/aaaaaaa.zip

我已经尝试过清理派生数据、重新安装Xcode、重新启动、等待几分钟等等。但都不起作用。

类似的事情也发生过几次,我通过将长语句拆分为多行解决了这个问题。

我在操场上测试了你的代码,我立即注意到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
}()

我也遇到了同样的问题。删除预编译头和派生数据似乎可以修复它。我不确定这是否会永久修复它,但至少目前它还在工作。

最新更新