2017-01-14 43 views
7

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?

Odpowiedz

5

Jest to znany problem w kompilatorze Swift. Problem polega na tym, że po użyciu zamknięć lub leniwych właściwości, takich jak ten, każdy plik Swift zostanie sprawdzony. Napisałem wpis na blogu na ten temat, który można znaleźć here.

+0

Chciałbym przeczytać Twój post wcześniej ... – iWheelBuy