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 застревает, и я больше ничего не могу сделать.

Открывая Activity Monitor, он отображает sourcekitservice и swift, используя более чем 100% CPU.

Я создал этот пример проекта с кодом выше: https://dl.dropboxusercontent.com/u/1393279/aaaaaaa.zip

Я уже пытался очистить производные данные, переустановить Xcode, перезагрузить компьютер, подождать минуты и т. Д. Это просто не работает.

2 ответа

Решение

Нечто подобное случалось со мной несколько раз, и я решил это, разбив длинные выражения на несколько строк.

Я проверил ваш код на игровой площадке и сразу заметил, что процесс SourceKitService потребляет 100% моего процессора.

В вашем коде самое длинное утверждение, которое я вижу, - это инициализация словаря, поэтому первым подходом было бы сделать его изменяемым и инициализировать с коротким количеством элементов в строке.

Свифт не предоставляет += оператор для словарей, так что сначала нам нужен один ( слава @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
}()

У меня такая же проблема. Удаление предварительно скомпилированных заголовков и полученных данных, казалось, исправило это. Я не уверен, что это исправит это навсегда, но пока это работает, по крайней мере.

Другие вопросы по тегам