/ / स्विफ्ट डिक्शनरी विद एक्सपैंसिव टाइप कंस्ट्रक्शन - स्विफ्ट, जेनरिक, शब्दकोश

विस्तारक प्रकार की बाधाओं के साथ स्विफ्ट शब्दकोश - तेज़, जेनेरिक, शब्दकोश

मैं एक ऐसे शब्दकोश को परिभाषित करना चाहूंगा जो मूल्यों के लिए कई विशिष्ट प्रकारों की अनुमति देता है। मैं वर्तमान में इस तरह एक शब्दकोष को परिभाषित कर सकता हूं:

var foo = [String: String]

जो एक विशिष्ट प्रकार के मूल्य में बाधा डालता है

या

var foo = [String: AnyObject]

जो AnyObject के मूल्य को कसता है, जो विशेष रूप से विवश नहीं है।

मैं कुछ ऐसा करना चाहता हूं:

var foo = [String: <String, Int>]

जो मुझे इस शब्दकोश में मूल्यों के रूप में केवल तार या स्याही डालने की अनुमति देगा।

जैसा कि मैंने देखा यहाँ एक एनम का उपयोग माना जाता है: स्विफ्ट में सामान्य शब्दकोश मूल्य प्रकार लेकिन मैं एक ऐसा रास्ता खोजूंगा जो मुझे नई एनम का विस्तार या निर्माण किए बिना गतिशील रूप से निर्दिष्ट करने की अनुमति देता है।

var bar = [String: <String, Int, Bool, MyClass>]

ऐसा लगता है कि मुझे एक बनाने में सक्षम होना चाहिए[स्ट्रिंग: AnyObject] के एक आंतरिक शब्दकोश के साथ आवरण वर्ग जो कि सम्मिलित किए जा सकने वाली कक्षाओं की एक लंबी सूची के खिलाफ संकलन समय की जाँच करने की अनुमति देगा।

class ECDictionary<T> {

private var internal_storage = [String: AnyObject]()

subscript(s: String) -> T {
get {
return internal_storage[s]
}
set(newValue) {
internal_storage[s] = newValue
}
}
}


var myECDictionary = ECDictionary<String, Int, OtherClass>()

मैं इसे रनटाइम प्रकार की जाँच के साथ बना सकता हूं, लेकिन मैं इसे संकलन समय पर लागू कर सकता हूं। क्या यह किसी भी तरह से संभव है?

उत्तर:

जवाब के लिए 3 № 1

अगर तुम चाहो तो Dictionary जहां मान हो सकता है a Stringएक Int, ए Bool या ए MyClass तुम्हे करना चाहिए

अपने प्रोटोकॉल को परिभाषित करें

protocol MyDictionaryValue { }

Conring String, Int, Bool and MyClass to MyDictionaryValue

extension String: MyDictionaryValue { }
extension Int: MyDictionaryValue { }
extension Bool: MyDictionaryValue { }
extension MyClass: MyDictionaryValue { }

अपने शब्दकोश की घोषणा करें

var dict = [String:MyDictionaryValue]()

प्रयोग

dict["a"] = "a string"
dict["b"] = 1
dict["c"] = true
dict["d"] = MyClass()

dict["e"] = CGPointZero // error
dict["f"] = UIView() // error