Ten source ma ustęp Ustawianie właściwości Wartość domyślna z zamknięciem lub Function gdzie możemy znaleźć przykładDomyślna wartość nieruchomości z zamknięciem sprawia kompilator przekompilować wszystkie pliki
Oto szkic szkielet jak zamknięcie może być wykorzystane w celu zapewnienia wartość domyślna właściwość:
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 }() }
Dobrze, używam go bardzo często ... również, często czekać na cały projekt do recompil e po zmianie tylko jednego symbolu. I dzisiaj odkryłem, że te dwie rzeczy są ze sobą powiązane.
Pozwala wyobrazić mamy jakąś klasę, gdzie możemy ustawić pewne właściwości domyślnych z zamknięciem oraz z funkcją
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
}
}
Również mamy jakąś inną klasę w oddzielnym pliku, w którym używamy powyższy Class1
class Class2 {
let value: Int
init(_ value: Int) {
self.value = value
_ = Class1(100)
}
}
i niektóre inne klasy w oddzielnym pliku, w którym używamy Class2
class Class3 {
let value: Int
init(_ value: Int) {
self.value = value
_ = Class2(100)
}
}
i etc ...
Zdecydowałem się użyć terminal
+ xcodebuild
+ grep
uzyskać tylko informacje o skompilowanych plików. To jest polecenie, którego używam, aby uzyskać informacje o kompilacji:
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)'
To wszystko na przygotowania. Teraz przejdźmy do Class1
i zmień 2222
na inną wartość. Uruchom powyższe polecenie i uzyskaj wynik.
0.1ms /Users/iwheelbuy/Documents/recompile/Test/Classes/Class1.swift:11:5 init(_ value: Int)
Wynik jest dobry. Ustawienie wartości domyślnej za pomocą funkcji działa zgodnie z oczekiwaniami. Zmieniliśmy jeden plik i skompilowaliśmy tylko jeden plik.
Następnie zmień wartość 1111
z Class1
na inną wartość i uruchom polecenie. Wyjście Terminal wygląda teraz tak:
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)
Wszystkie zajęcia były zrekompilowane ... Teraz wyobraź sobie, że masz duży projekt i każdą małą zmianę w zamknięciu wartość domyślna sprawia, że można czekać na cały projekt rekompilacji.
Pytania:
- Jaki jest powód?
- Jakieś sugestie, jak korzystać z domyślnych wartości zamknięcia i nie ponosić rekompilacji?
- Związany z this topic?
Chciałbym przeczytać Twój post wcześniej ... – iWheelBuy