2017-01-14 5 views
7

यह source एक पैराग्राफ एक बंद या समारोह के साथ एक डिफ़ॉल्ट संपत्ति मूल्य निर्धारित करना है, जहां हम एक उदाहरणबंद के साथ डिफ़ॉल्ट संपत्ति के मूल्य सभी फाइलों

यहाँ पा सकते हैं कि कैसे की एक कंकाल रूपरेखा है है पुन: संयोजित करने के लिए एक संकलक बनाता है

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 
    }() 
} 

ठीक है, मैं यह बहुत बार का उपयोग करें ... इसके अलावा, मैं अक्सर पूरी परियोजना recompil के लिए प्रतीक्षा: एक बंद एक डिफ़ॉल्ट संपत्ति के मूल्य प्रदान करने के लिए इस्तेमाल किया जा सकता ई सिर्फ एक प्रतीक बदलने के बाद। और आज मैंने पाया है कि ये दो चीजें एक-दूसरे से जुड़ी हैं।

चलें कल्पना हम कुछ वर्ग है जहां हम एक बंद के साथ और एक समारोह के साथ

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) 
    } 
} 
01 का उपयोग में कुछ अन्य वर्ग

और आदि ...

मैं 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) 

सभी वर्गों कंपाइल किया गया ... अब कल्पना आप एक बड़े परियोजना और एक डिफ़ॉल्ट मान बंद में किसी भी छोटे परिवर्तन पूरी परियोजना पुन: संयोजित करने के लिए आप प्रतीक्षा करता है है।

सवाल:

  • कारण क्या है?
  • कोई भी सुझाव डिफ़ॉल्ट मूल्य बंद करने का उपयोग कैसे करें और पुन: संकलन से पीड़ित नहीं है?
  • this topic से संबंधित?

उत्तर

5

यह स्विफ्ट कंपाइलर में एक ज्ञात समस्या है। मुद्दा यह है कि एक बार जब आप इस तरह के बंद या आलसी गुणों का उपयोग करते हैं, तो प्रत्येक एकल स्विफ्ट फ़ाइल टाइप की जाएगी। मैंने इस विषय पर एक ब्लॉग पोस्ट लिखा है जिसे आप here पा सकते हैं।

+0

मेरी इच्छा है कि मैंने आपकी पोस्ट पहले पढ़ ली है ... – iWheelBuy

संबंधित मुद्दे