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