मैं स्विफ्ट में उपयोग के लिए एक उपयुक्त सिंगलटन मॉडल बनाने की कोशिश कर रहा हूं। अब तक, मैं एक गैर-थ्रेड सुरक्षित मॉडल प्राप्त करने में सक्षम रहा हूं:
class var sharedInstance: TPScopeManager {
get {
struct Static {
static var instance: TPScopeManager? = nil
}
if !Static.instance {
Static.instance = TPScopeManager()
}
return Static.instance!
}
}
स्टैटिक संरचना में सिंगलटन उदाहरण को लपेटने से एकल उदाहरण की अनुमति मिलती है जो जटिल नामकरण स्कीमों के बिना सिंगलटन इंस्टेंस से नहीं टकराती है, और यह चीजों को काफी निजी बनाना चाहिए। जाहिर है, हालांकि, यह मॉडल थ्रेड-सुरक्षित नहीं है। इसलिए मैंने dispatch_once
पूरी बात को जोड़ने की कोशिश की :
class var sharedInstance: TPScopeManager {
get {
struct Static {
static var instance: TPScopeManager? = nil
static var token: dispatch_once_t = 0
}
dispatch_once(Static.token) { Static.instance = TPScopeManager() }
return Static.instance!
}
}
लेकिन मुझे dispatch_once
लाइन पर एक कंपाइलर त्रुटि मिलती है :
अभिव्यक्ति के प्रकार 'शून्य' को 'टाइप' () में नहीं बदल सकते
मैंने सिंटैक्स के कई अलग-अलग रूपों की कोशिश की है, लेकिन वे सभी एक ही परिणाम हैं:
dispatch_once(Static.token, { Static.instance = TPScopeManager() })
dispatch_once
स्विफ्ट का उपयोग करने का उचित उपयोग क्या है ? मैंने शुरू में सोचा था ()
कि त्रुटि संदेश के कारण समस्या ब्लॉक के साथ थी , लेकिन जितना अधिक मैं इसे देखता हूं, उतना ही मुझे लगता है कि यह dispatch_once_t
सही ढंग से परिभाषित होने की बात हो सकती है ।
@lazy
थ्रेड सुरक्षित होना चाहिए।
Static.instance = TPScopeManager()
उदाहरण प्रकार को बल देता है। यदि आप Static.instance = self()
किसी आवश्यक इनिशियलाइज़र के साथ कुछ का उपयोग करते हैं , तो उपयुक्त प्रकार वर्ग उत्पन्न किया जाएगा। फिर भी, और यह ध्यान देने योग्य बात है, केवल एक बार पदानुक्रम में सभी उदाहरणों के लिए! आरंभ करने के लिए पहला प्रकार सभी उदाहरणों के लिए निर्धारित प्रकार है। मुझे नहीं लगता कि ऑब्जेक्टिव-सी ने ऐसा ही व्यवहार किया है।