Значение свойства по умолчанию с закрытием заставляет компилятор перекомпилировать все файлы

этоисточник есть параграфУстановка значения свойства по умолчанию с помощью замыкания или функции где мы можем найти пример

Вот скелетный план того, как замыкание может использоваться для предоставления значения свойства по умолчанию:

class SomeClass {

    let someProperty: SomeType = {
         // create a default value for someProperty inside this closure
         // someValue must be of the same type as SomeType
         return someValue
    }() 
}

Ну, я использую это очень часто ... Кроме того, я часто жду, пока весь проект перекомпилируется после замены только одного символа. И сегодня я обнаружил, что эти две вещи связаны друг с другом.

Давайте представим, что у нас есть некоторый класс, в котором мы устанавливаем некоторые свойства по умолчанию с закрытием и с функцией

class Class1 {

    let value: Int

    init(_ value: Int) {
        self.value = value
    }

    private lazy var lazyValueWithClosure: Int = {
        return 1111
    }()

    private lazy var lazyValueWithFunction: Int = self.getValue()

    private func getValue() -> Int {
        return 2222
    }
}

Также у нас есть другой класс в отдельном файле, где мы используем вышеClass1

class Class2 {

    let value: Int

    init(_ value: Int) {
        self.value = value
        _ = Class1(100)
    }
}

И какой-то другой класс в отдельном файле, где мы используемClass2

class Class3 {

    let value: Int

    init(_ value: Int) {
        self.value = value
        _ = Class2(100)
    }
}

и так далее...

Я решил использоватьterminal + xcodebuild + grep получить только информацию о перекомпилированных файлах. Это команда, которую я использую, чтобы получить информацию о компиляции:

xcodebuild -scheme Test -sdk iphonesimulator -arch x86_64 -configuration Debug build OTHER_SWIFT_FLAGS="-Xfrontend -debug-time-function-bodies" | grep '^[0-9]\{1,20\}.[0-9]\{1,20\}ms.*init(_ value: Int)'

Это все для приготовления. Теперь мы идем кClass1 и изменить2222 на какую-то другую ценность. Запустите приведенную выше команду и получите результат.

0.1ms   /Users/iwheelbuy/Documents/recompile/Test/Classes/Class1.swift:11:5 init(_ value: Int)

Результат хорош. Установка значения по умолчанию с помощью функций работает как ожидалось. Мы изменили один файл, и только один файл был скомпилирован.

Тогда давайте изменим значение1111 отClass1 в другое значение и выполните команду. Вывод терминала теперь выглядит так:

0.8ms   /Users/iwheelbuy/Documents/recompile/Test/Classes/Class5.swift:11:5 init(_ value: Int)
0.3ms   /Users/iwheelbuy/Documents/recompile/Test/Classes/Class1.swift:11:5 init(_ value: Int)
1.0ms   /Users/iwheelbuy/Documents/recompile/Test/Classes/Class4.swift:11:5 init(_ value: Int)
0.3ms   /Users/iwheelbuy/Documents/recompile/Test/Classes/Class3.swift:11:5 init(_ value: Int)
0.3ms   /Users/iwheelbuy/Documents/recompile/Test/Classes/Class2.swift:11:5 init(_ value: Int)

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

Вопросы:

Какова причина?Любые предложения, как использовать закрытие значений по умолчанию и не страдать от перекомпиляции?Относится кЭта тема?

Ответы на вопрос(1)

Ваш ответ на вопрос