स्विफ्ट 3 में गुणों के साथ सिंगलटन


88

कोको और ऑब्जेक्टिव-सी डॉक्यूमेंट (स्विफ्ट 3 के लिए अपडेटेड) के साथ एप्पल के यूजिंग स्विफ्ट में वे सिंगलटन के निम्नलिखित उदाहरण देते हैं:

class Singleton {
    static let sharedInstance: Singleton = {
        let instance = Singleton()

        // setup code

        return instance
    }()
}

आइए कल्पना करें कि इस सिंगलटन को स्ट्रिंग्स के एक वैरिएबल सरणी को प्रबंधित करने की आवश्यकता है। मैं उस संपत्ति को कैसे / कहां घोषित करूंगा और यह सुनिश्चित करूंगा कि इसे खाली [String]सरणी में ठीक से आरंभ किया जाए ?

जवाबों:


236

मेरे लिए यह सबसे अच्छा तरीका है, इनिट को निजी बनाएं। स्विफ्ट 3 \ 4 \ 5 वाक्यविन्यास

// MARK: - Singleton

final class Singleton {

    // Can't init is singleton
    private init() { }

    // MARK: Shared Instance

    static let shared = Singleton()

    // MARK: Local Variable

    var emptyStringArray = [String]()

}

4
मैंने इस उत्तर को बदल दिया, लेकिन स्विफ्ट 3 सिंटैक्स से मिलान करने के लिए, "साझाकरण" को केवल "साझा" में बदल दिया जाना चाहिए।
बी-रेड

1
जब तक कि स्विफ्ट 2 से स्विफ्ट 3 का एक प्रतिगमन न हो
थिबुत नोह

1
साझा किए जाने के बाद का प्रकार छोड़ा जा सकता है, है ना? static let shared = Singleton()
क्रिसविलो

1
@YannickSteph आपको लिखने की ज़रूरत नहीं है static let shared: Singleton = Singleton()इसके बजाय आप बस लिख सकते हैंstatic let shared = Singleton()
chriswillow

3
@RomanN नहीं, आप इनटाइड को ओवरराइड नहीं कर सकते क्योंकि यह एक वर्ग को विरासत में नहीं मिलता है। यदि आप ऐसा कर सकते हैं, तो इस उदाहरण के साथ final class Singleton: NSObject { private override init() { } }
यानास्टेफ

59

आप इस तरह एक खाली सरणी को इनिशियलाइज़ कर सकते हैं।

class Singleton {

    //MARK: Shared Instance

    static let sharedInstance : Singleton = {
        let instance = Singleton(array: [])
        return instance
    }()

    //MARK: Local Variable

    var emptyStringArray : [String]

    //MARK: Init

    init( array : [String]) {
        emptyStringArray = array
    }
}

या यदि आप एक अलग दृष्टिकोण पसंद करते हैं, तो यह ठीक होगा।

class Singleton {

    //MARK: Shared Instance

    static let sharedInstance : Singleton = {
        let instance = Singleton()
        return instance
    }()

    //MARK: Local Variable

    var emptyStringArray : [String]? = nil

    //MARK: Init

    convenience init() {
        self.init(array : [])
    }

    //MARK: Init Array

    init( array : [String]) {
        emptyStringArray = array
    }
}

क्या यह विधि एक विस्तार में काम नहीं करती है? extension Cache { static let sharedInstance: Cache = { let instance = Cache() return instance }() }
एंडी

1
दिलचस्प है कि Apple class variOS 10 में सिंगलनेट्स (उदाहरण के लिए UIApplication) का उपयोग करता है। क्या उनका क्रियान्वयन इस तरह होगा?
जजती

2
मैं सिंगलटन इनिट विधियों को पसंद करता हूं क्योंकि वे privateविधियां भी नहीं हैं internal। यह दूसरों को इस वर्ग के लिए डिफ़ॉल्ट '(') इनिशियलाइज़र के उपयोग से रोकता है।
कुमार सी।

1
@KumarC आप सही हैं, यह समस्या का समाधान नहीं होता है अगर हम एक जोड़ने privateमें init

@TikhonovAlexander क्या आप और अधिक जानकारी ला सकते हैं?
डोमिनिक शीशी

30

ऐप्पल के दस्तावेज़ के अनुसार: स्विफ्ट में, आप केवल एक स्थिर प्रकार की संपत्ति का उपयोग कर सकते हैं, जो कि केवल एक बार कई थ्रेड्स में एक्सेस किए जाने पर भी, केवल एक बार ही लाज़िली इनिशियलाइज़ होने की गारंटी है

class Singleton {

    // MARK: - Shared

    static let shared = Singleton()
}

आरंभीकरण विधि के साथ:

class Singleton {

    // MARK: - Shared

    static let shared = Singleton()

    // MARK: - Initializer

    private init() {
    }

}

3
क्यों init () निजी नहीं है?
XcodeNOOB

0

किसी भी प्रारंभिक प्रक्रिया को एक init विधि में किया जाएगा। एक सिंगलटन और एक गैर-सिंगलटन के बीच यहां कोई अंतर नहीं है।


26
एक अतिरिक्त कोड स्निपेट जो सीधे प्रश्न का उत्तर देता है, इस उत्तर को अधिक सहायक बनाता है।
रेडा लेमेडेन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.