2016-04-29 8 views
5

मैं अपने शुरुआती लोगों के बीच कोड दोहराने से कैसे बच सकता हूं? मैं डेटफॉर्मेटर को स्थिर रहने के लिए चाहता हूं।स्विफ्ट प्रारंभकर्ता में कोड दोहराने से बचें

let dateFormatter: NSDateFormatter 

init() { 
    dateFormatter = NSDateFormatter() 
    dateFormatter.dateStyle = .MediumStyle 
    dateFormatter.timeStyle = .MediumStyle 
    super.init(nibName: nil, bundle: nil) 
} 

required init?(coder aDecoder: NSCoder) { 
    dateFormatter = NSDateFormatter() 
    dateFormatter.dateStyle = .MediumStyle 
    dateFormatter.timeStyle = .MediumStyle 
    super.init(coder: aDecoder) 
} 

override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) { 
    dateFormatter = NSDateFormatter() 
    dateFormatter.dateStyle = .MediumStyle 
    dateFormatter.timeStyle = .MediumStyle 
    super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil) 
} 

उत्तर

9

यदि यह वास्तव में वास्तविक कोड

lazy var dateFormatter : NSDateFormatter = { 
    let formatter = NSDateFormatter() 
    formatter.dateStyle = .MediumStyle 
    formatter.timeStyle = .MediumStyle 
    return formatter 
}() 

चर के साथ पूरे कोड के स्थान पर है lazily एक बार आरंभ नहीं हो जाता है, जब यह पहली बार पहुँचा है

संपादित करें: यह भी चर घोषित करने के लिए संभव है आलसी विशेषता के बिना स्थिर के रूप में।

let dateFormatter : NSDateFormatter = { ... 

अंतर यह है कि फ़ॉर्मेटर उदाहरण के प्रारंभ के दौरान तुरंत बनाई गई है (नहीं lazily) है।

संपादित करें:

स्विफ्ट 3 NSDateFormatter में .mediumStyle

+1

आलसी होने के लिए, आपको यहां आलसी उपसर्ग को जोड़ने की ज़रूरत है? और परिवर्तन करने के लिए var। अन्यथा डेट फॉर्मेटर तर्क लापरवाही नहीं किया जाएगा बल्कि हर बार इसे एक्सेस किया जाता है। –

+1

नहीं, आप दोनों रूपों का उपयोग कर सकते हैं, मैंने अभी इसे एक खेल के मैदान में परीक्षण किया है। – vadian

+0

'नोट आपको हमेशा एक आभासी संपत्ति (चर कीवर्ड के साथ) के रूप में आलसी संपत्ति घोषित करनी चाहिए, क्योंकि इसके प्रारंभिक मान को प्रारंभिक प्रारंभ होने के बाद तक पुनर्प्राप्त नहीं किया जा सकता है। शुरुआती गुणों को प्रारंभिक पूर्ण होने से पहले हमेशा एक मान होना चाहिए, और इसलिए आलसी के रूप में घोषित नहीं किया जा सकता है। [स्रोत] (https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Properties.html) – Laffen

0

एक ही रास्ता मैं के बारे में सोच सकता है कि:

class Sample: UIViewController { 
    let dateFormatter: NSDateFormatter = NSDateFormatter() 

    init() { 
     super.init(nibName: nil, bundle: nil) 
     setupDateFormatter() 
    } 

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
     setupDateFormatter() 
    } 

    override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) { 
     super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil) 
     setupDateFormatter() 
    } 

    private func setupDateFormatter() { 
     dateFormatter.dateStyle = .MediumStyle 
     dateFormatter.timeStyle = .MediumStyle 
    } 
} 
+0

मैं आपके उत्तर की सराहना करता हूं। यदि आपकी दिलचस्पी है तो मैंने अपनी पोस्ट संपादित की है। –

3

इस मामले आप कर सकते थे set the default property value of the date formatter using a closure में।

फिर अपनी संपत्ति घोषणा हो जाता है:

let dateFormatter: NSDateFormatter = { 
    let dateFormatter = NSDateFormatter() 
    dateFormatter.dateStyle = .MediumStyle 
    dateFormatter.timeStyle = .MediumStyle 
    return dateFormatter 
}() 

और आप अपने initialisers से तारीख फ़ॉर्मेटर बिट्स निकाल सकते हैं।

0

-DateFormatter
और .MediumStyle को नाम दिया गया है आप स्थापना के लिए एक संपत्ति की जरूरत है, तो मैं vadian के रास्ते के लिए जाना होगा। लेकिन आपके सेटअप कोड को जटिल प्रक्रिया तैयार करने या छवि कैश तैयार करने जैसी कुछ प्रक्रिया की आवश्यकता है, तो मुझे आलसी var बंद करने की चाल के लिए जाना पसंद है। यह सेटअप बंद केवल एक बार निष्पादित होता है, जैसे किसी अन्य आलसी var गुणों को एक बार शुरू किया जाता है। तो आप यहाँ बहुत जटिल पर्याप्त प्रक्रियात्मक कोड लिख सकते हैं। private जोड़ें मत भूलना, तो आपके उप-वर्ग आपके व्यवसाय में हस्तक्षेप नहीं करेंगे।

class MyViewController: NSViewController { 

    init() { 
     super.init(nibName: nil, bundle: nil)! 
     self.setup() 
    } 

    override init?(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) { 
     super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil) 
     self.setup() 
    } 

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
     self.setup() 
    } 

    override func encodeWithCoder(aCoder: NSCoder) { 
     super.encodeWithCoder(aCoder) 
    } 

    lazy private var setup:()->() = { 
     // do some complex procedure here!! 
     return {} 
    }() 
} 
+0

आपके सुझाव के लिए धन्यवाद। मैं विशेष रूप से दिलचस्पी रखने के लिए मूल्यों को आवंटित करने में रुचि रखता हूं, जिसे एक init विधि के भीतर निष्पादित किया जाना चाहिए। –

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