2015-11-18 11 views
9

मैं एक typealias हैस्विफ्ट में, टाइपलाइज़ कैसे बढ़ाएं?</p> <pre><code>typealias BeaconId = [String: NSObject] </code></pre> <p>मैं की तरह कुछ कर रही द्वारा यह विस्तार करने के लिए करना चाहते हैं::

extension BeaconId {} 

लेकिन यह एक संकलन त्रुटि फेंकता है:

Constrained extension must be declared on the unspecialized generic type 'Dictionary' with constraints specified by a 'where' clause

तो मैं अंत ऊपर कर रहा है:

extension Dictionary where Key: StringLiteralConvertible, Value: NSObject {} 

क्या ऐसा करने के लिए कोई क्लीनर तरीका है?

+1

मैं अपने कोड को साफ करने का प्रयास किया "कंस्ट्रेन्ड विस्तार एक 'जहां' खंड द्वारा निर्दिष्ट बाधाओं के साथ unspecialized सामान्य प्रकार 'शब्दकोश' पर घोषित किया जाना चाहिए" और वास्तव में यह त्रुटि आई: 'विवश विस्तार घोषित किया जाना चाहिए एक 'जहां' सीएल द्वारा निर्दिष्ट बाधाओं के साथ unspecialized जेनेरिक प्रकार 'शब्दकोश' पर ause' – BallpointBen

+0

हाँ मुझे यह भी मिला, आप नीचे मेरा पूरा जवाब देख सकते हैं। असल में ऐसा नहीं लगता है कि निर्दिष्ट जेनेरिक प्रकारों को विस्तारित करना संभव है, केवल वे लोग जहां सामान्य प्रकार अभी तक सेट नहीं किए गए हैं। – barndog

+0

@ रॉबर्ट जो मुझे स्विफ्ट 3 में देखना पसंद है, प्रोटोकॉल और विरासत पर केवल बाधाओं पर नहीं बल्कि मूल्यों पर भी कुछ है, जैसे 'विस्तार कुछ ऐसा जहां स्वयं == .MyCase'। इस तरह कार्यक्षमता केवल विशिष्ट enum मामलों पर परिभाषित किया जा सकता है। – barndog

उत्तर

2

AFAIK, नहीं।

निम्न उदाहरण पर विचार करें:

typealias Height: Float 

extension: Height { 

} 

यहाँ Height, एक नए प्रकार नहीं है यह सिर्फ Float ताकि आप केवल Float का विस्तार कर रहे के लिए एक लेबल है। आप Dictionary पर एक नज़र डालें तो यह है कि तुम क्या

extension BeaconID {} 

विशिष्ट सामान्य मानकों के साथ Dictionary के लिए एक विस्तार जोड़ रहा है के साथ प्राप्त करने की कोशिश होगी तो public struct Dictionary<Key : Hashable, Value> : CollectionType, DictionaryLiteralConvertible है।

मैं क्या उम्मीद करेंगे कि आप ऐसा करने में सक्षम होना चाहिए:

typealias BeaconID = Dictionary<Key: String, Value: NSObject> 

लेकिन वह भी संकलन नहीं है और है कि क्योंकि स्विफ्ट में आप typealias आंशिक प्रकार (दूसरे शब्दों में सामान्य प्रकार के बिना नहीं कर सकते विशिष्ट जेनेरिक पैरामीटर प्रकार। अधिक जानकारी के लिए here देखें)। सामान्य प्रकार के जो जवाब नीचे विख्यात है typealiasing के लिए एक संभावित समाधान, मैं

struct Wrapper<Key: Hashable, Value> { 
    typealias T = Dictionary<Key, Value> 
} 
typealias BeaconID = Wrapper<String, NSObject>.T 

लेकिन फिर भी तब जब आप BeaconID फैलाने का प्रयास करते हैं, तो आप एक संकलक चेतावनी है, जो अंत में समस्या के दिल में हो जाता है मिलता है से जुड़ा हुआ:

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