2016-09-17 10 views
5

तो आप स्विफ्ट में जेनेरिक क्लास स्थिरांक को कैसे परिभाषित करते हैं?तेजी से एक सामान्य वर्ग में स्थिर स्थिरता को परिभाषित करने के लिए कैसे?

समस्या

एक "सामान्य" वर्ग के लिए

आप उन्हें इस तरह परिभाषित कर सकते हैं:

class C { 
    static let k = 1 
} 

let a = C.k // 1 

लेकिन अगर आप एक सामान्य वर्ग पर भी ऐसा ही:

class C<T> { 
    static let k = 1 
} 

आप संकलन पर निम्न त्रुटि प्राप्त करें:

,210

स्टेटिक संग्रहीत गुण अभी तक सामान्य प्रकार

में समर्थित नहीं तो कैसे इस समस्या के समाधान के लिए?

मेरे वर्तमान समाधान

अभी, मैं इस को हल करने के struct उपयोग कर रहा हूँ:

struct CConstant { 
    static let K = 1 
} 

यह सामान्य वर्ग के दायरे में परिभाषित नहीं है, लेकिन यह मेरे लिए काम करता है। क्या आपके पास बेहतर समाधान है?

-

पुनश्च: यह मेरा पहला सवाल यहाँ है, इसलिए मदद कृपया मुझे इस प्रश्न में सुधार अगर आपको लगता है यह आवश्यक है =)

उत्तर

2

आप fileprivate या private एक्सेस स्तर के साथ वैश्विक निरंतर परिभाषित कर सकते हैं उसी फ़ाइल में जहां आपकी जेनेरिक क्लास परिभाषित की गई है। तो यह इस फ़ाइल के बाहर दिखाई नहीं देगा और वैश्विक (मॉड्यूल) नामस्थान प्रदूषित नहीं करेगा।

आप वर्तमान फ़ाइल के बाहर से इस निरंतर उपयोग करने की जरूरत है तो यह घोषणा internal (डिफ़ॉल्ट पहुंच का स्तर) या public और नाम के रूप में यह ClassConstant की तरह तो यह स्पष्ट है कि यह Class से संबंधित हो जाएगा।

access levels in Swift 3 के बारे में और पढ़ें।

+0

इसका उत्तर देने के लिए धन्यवाद! आपका सुझाव मेरे वर्तमान समाधान की एक ही दिशा में प्रतीत होता है। मुझे सिर्फ संदर्भ के आधार पर एक्सेसर्स निर्दिष्ट करना होगा। क्या आपको पता है कि क्यों 'स्टेटिक संग्रहित गुण अभी तक जेनेरिक प्रकारों में समर्थित नहीं हैं'? – ghashi

+0

मुझे लगता है कि वे अभी तक समर्थित नहीं हैं क्योंकि आप सामान्य प्रकार का उपयोग अपने प्रकार के पैरामीटर निर्दिष्ट किए बिना नहीं कर सकते हैं। और यदि आप स्थिर संपत्ति का उपयोग करना चाहते हैं तो 'SomeClass .someConstant' बदसूरत लगेगा। इसे टाइप पैरामीटर निर्दिष्ट किए बिना काम करने के लिए इसे कंपाइलर में कार्यान्वित करने की आवश्यकता है और मुझे लगता है कि यह स्विफ्ट टीम के लिए शीर्ष प्राथमिकता कार्य नहीं है। – mixel

1
तुच्छ मूल्य टाइप स्थिरांक के लिए

, तो आप बस एक केवल पढ़ने के लिए स्थिर गणना संपत्ति को लागू कर सकते हैं:,

class C<T> { 
    // will be evaluated every time the static property is accessed, 
    // therefore not suited for non-trivial constants. 
    static var k : Int { return 1 } 
} 

let a = C<()>.k // Access k on C<Void> 

यह 'ग्लोबल नेम स्पेस' प्रदूषण नहीं को लाभ मिलता है के रूप में यह C<T> पर एक स्थिर सदस्य है । दुर्भाग्यवश, आपको निरंतर उपयोग करने के लिए एक सामान्य पैरामीटर निर्दिष्ट करना होगा - क्योंकि आप जेनेरिक पैरामीटर के बिना जेनेरिक क्लास के प्रकार का उल्लेख नहीं कर सकते हैं (क्योंकि स्थिर दायरे में कुछ भी इसे परिभाषित करने की आवश्यकता हो सकती है)।

गैर तुच्छ स्थिरांक के लिए, आप एक निजी वैश्विक निरंतर निर्धारित कर सकते हैं, और बाहर की दुनिया के लिए इसे उजागर करने के लिए आपके सामान्य वर्ग में एक केवल पढ़ने के लिए स्थिर गणना संपत्ति का उपयोग करें:

private let _k = SomeClass() 

class C<T> { 
    static var k : SomeClass { return _k } 
} 

फिर से, यह आपको C<T> पर एक स्थिर सदस्य के रूप में उपयोग करने की अनुमति देता है जबकि 'वैश्विक नामस्थान' को प्रदूषित नहीं करता है (यद्यपि स्विफ्ट फ़ाइल के बाहर नहीं जिसे आप इसे परिभाषित करते हैं)।

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