2015-08-30 11 views
7

का उपयोग किए बिना एनम में एक्सेस स्ट्रिंग मान मैं डेटाबेस में कॉलम तक पहुंचने के लिए उपयोग की जा रही कुंजी के लिए नेस्टेड एनम के साथ अपने वैश्विक स्ट्रिंग स्थिरांक को प्रतिस्थापित करना चाहता हूं।कच्चे वैल्यू

enum DatabaseKeys { 

    enum User: String { 
     case Table = "User" 
     case Username = "username" 
     ... 
    } 

    ... 

} 

डेटाबेस में हर तालिका एक आंतरिक enum है, टेबल enum के शीर्षक होने का नाम के साथ:

संरचना इस प्रकार है। प्रत्येक enum में पहला मामला तालिका का नाम होगा, और निम्नलिखित मामले इसकी तालिका में कॉलम हैं।

इस का उपयोग करने के लिए, यह बहुत सरल है:

myUser[DatabaseKeys.User.Username.rawValue] = "Johnny" 

लेकिन मैं इन enums एक बहुत का उपयोग किया जाएगा। प्रत्येक उदाहरण के लिए .rawValue जोड़ना एक दर्द होगा, और यह उतना पठनीय नहीं है जितना मैं चाहता हूं। मैं rawValue का उपयोग किए बिना स्ट्रिंग मान तक कैसे पहुंच सकता हूं?

myUser[DatabaseKeys.User.Username] = "Johnny" 

ध्यान दें कि मैं स्विफ्ट 2. उपयोग कर रहा हूँ वहाँ यह पूरा करने के एक और भी बेहतर तरह से मैं यह जानकर प्रसन्नता होगी कि बताया गया है: अगर मैं ऐसा कर सकते हैं यह बहुत अच्छा होगा!

+0

वस्तु किस तरह 'है' 'myUser'''? एक शब्दकोश या अपनी ऑब्जेक्ट एक सबस्क्रिप्ट के साथ? –

+0

@AndyIbanez यह मेरे मामले में एक साधारण शब्दकोश, या एक पीएफयूसर हो सकता है क्योंकि मैं पार्स – Joey

उत्तर

14

जबकि मुझे enums के साथ वांछित वाक्यविन्यास का उपयोग करके ऐसा करने का कोई तरीका नहीं मिला, यह structs का उपयोग करना संभव है।

struct DatabaseKeys { 

    struct User { 
     static let identifier = "User" 
     static let Username = "username" 
    } 

} 

का उपयोग करें:

myUser[DatabaseKeys.User.Username] = "Johnny" 

एप्पल WatchKit टेम्पलेट्स में स्टोरीबोर्ड और पंक्ति प्रकार पहचानकर्ता के लिए इस तरह structs उपयोग करता है।

+0

यह जानना अच्छा है कि ~ thx दोस्त – Jerome

6

आप इसके लिए कस्टमस्ट्रिंग कनवर्टिबल प्रोटोकॉल का उपयोग कर सकते हैं।

प्रलेखन से,

स्ट्रिंग (उदाहरण), किसी भी प्रकार का एक उदाहरण के लिए काम करेंगे अपनी वर्णन लौटने अगर उदाहरण CustomStringConvertible होता है। कस्टम स्ट्रिंग कन्वर्टिबल को सामान्य बाधा के रूप में उपयोग करना, या को अनुरूप प्रकार के विवरण को सीधे एक्सेस करना, इसलिए निराश है।

तो, यदि आप इस प्रोटोकॉल के अनुरूप हैं और विवरण विधि के माध्यम से अपना कच्चा वैल्यू वापस कर दें, तो आप मूल्य प्राप्त करने के लिए स्ट्रिंग (टेबल.उसर) का उपयोग करने में सक्षम होंगे।

enum User: String, CustomStringConvertible { 

    case Table = "User" 
    case Username = "username" 

    var description: String { 
     return self.rawValue 
    } 
} 

var myUser = [String: String]() 
myUser[String(DatabaseKeys.User.Username)] = "Johnny" 

print(myUser) // ["username": "Johnny"] 
+1

का उपयोग कर रहा हूं, यह दिलचस्प है। हालांकि स्ट्रिंग को प्रारंभ करने के लिए 'स्ट्रिंग' का उपयोग करना अभी भी अक्षम है। : पी मैं वास्तव में 'स्ट्रिंग()' में इसे लपेटने के बजाय 'rawValue' का उपयोग करता हूं। – Joey

0

आप User के रूप में शब्दकोश के बजाय String (UserHashable डिफ़ॉल्ट रूप से है) कुंजी यह एक समाधान हो सकता है का उपयोग करने में सक्षम हैं।

यदि आपको अपने नेस्टेड स्ट्रक्चर और स्थिर चर/स्थिरांक के साथ उपयोग नहीं करना चाहिए।

0

आप कस्टम वर्ग के साथ ऐसा कर सकते हैं:

enum Names: String { 
    case something, thing 
} 

class CustomData { 
    subscript(key: Names) -> Any? { 
     get { 
      return self.customData[key.rawValue] 
     } 

     set(newValue) { 
      self.customData[key.rawValue] = newValue 
     } 
    } 

    private var customData = [String: Any]() 
} 

... 

let cData = CustomData() 
cData[Names.thing] = 56 

संपादित करें:
मैं एक एक और समाधान पाया गया कि स्विफ्ट 3 के साथ काम:

enum CustomKey: String { 
    case one, two, three 
} 

extension Dictionary where Key: ExpressibleByStringLiteral { 
    subscript(key: CustomKey) -> Value? { 
     get { 
      return self[key.rawValue as! Key] 
     } 
     set { 
      self[key.rawValue as! Key] = newValue 
     } 
    } 
} 

var dict: [String: Any] = [:] 
dict[CustomKey.one] = 1 
dict["two"] = true 
dict[.three] = 3 
print(dict["one"]!) 
print(dict[CustomKey.two]!) 
print(dict[.three]!) 
+0

क्या किसी भी वर्ग के उत्तराधिकारी के लिए ऐसा करने के लिए वैसे भी ऐसा है? –

+0

क्या यह केवल एक कुंजीपटल कुंजी के रूप में enum के उपयोग के लिए है? –

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