Значение свойства по умолчанию с закрытием заставляет компилятор перекомпилировать все файлы
этоисточник есть параграфУстановка значения свойства по умолчанию с помощью замыкания или функции где мы можем найти пример
Вот скелетный план того, как замыкание может использоваться для предоставления значения свойства по умолчанию:
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)
Все классы были перекомпилированы ... Теперь представьте, что у вас большой проект, и любое небольшое изменение в закрытии значения по умолчанию заставляет вас ждать, пока весь проект перекомпилируется.
Вопросы:
Какова причина?Любые предложения, как использовать закрытие значений по умолчанию и не страдать от перекомпиляции?Относится кЭта тема?