2015-11-19 6 views
13

निम्नलिखित मॉडल को ध्यान में रखते:मैं रीयलम स्विफ्ट के साथ एक शब्दकोश कैसे स्टोर कर सकता हूं?

class Person: Object { 
    dynamic var name = "" 
    let hobbies = Dictionary<String, String>() 
} 

मैं क्षेत्र में टाइप [String:String] का एक उद्देश्य है कि मैं एक Alamofire अनुरोध से मिला शेयर करने की कोशिश कर रहा हूँ, लेकिन hobbies नहीं के बाद से कर सकते हैं के अनुसार let के माध्यम से परिभाषित किया जाना है RealmSwift दस्तावेज़ीकरण के लिए यह List<T>/Dictionary<T,U> प्रकार का प्रकार है।

let hobbiesToStore: [String:String] 
// populate hobbiestoStore 
let person = Person() 
person.hobbies = hobbiesToStore 

मैं भी init() को फिर से परिभाषित करने की कोशिश की, लेकिन हमेशा एक गंभीर त्रुटि वरना साथ समाप्त हो गया।

मैं रीयलस्विफ्ट में एक शब्दकोश को आसानी से कॉपी या प्रारंभ कैसे कर सकता हूं? क्या मुझे यहां कुछ मामूली याद आ रही है?

उत्तर

19

Dictionary रीयलम में संपत्ति प्रकार के रूप में समर्थित नहीं है।

class Person: Object { 
    dynamic var name = "" 
    let hobbies = List<Hobby>() 
} 

class Hobby: Object { 
    dynamic var name = "" 
    dynamic var descriptionText = "" 
} 

अक्रमांकन लिए, आप अपने शब्दकोश मैप करने की आवश्यकता होगी: आप एक नया वर्ग, जिसका वस्तुओं के रूप में नीचे देखा प्रत्येक मुख्य-मान-जोड़ी और से कई कि करने के लिए संबंधों का वर्णन शुरू करने की आवश्यकता होगी आपके जेएसओएन में हॉबी ऑब्जेक्ट्स में संरचना और उचित संपत्ति के लिए कुंजी और मूल्य असाइन करें।

+0

धन्यवाद! मैंने इस समाधान के बारे में भी सोचा है (क्योंकि यह सबसे साफ है) लेकिन यह वास्तव में निराशाजनक है कि रियलमस्विफ्ट में किसी भी स्विफ्ट संरचनाओं का उपयोग करने में सक्षम न हो ... (यहां तक ​​कि tuples :() जैसा कि मेरा डेटा वास्तव में है स्थिर और सरल, मैंने दोनों तारों को एक डिलीमीटर के साथ विलय कर दिया और एक 'सूची ' – gabuchan

+0

बनाया है ऐसी सीमाएं हैं जो हमें किसी भी सामान्य स्विफ्ट संरचनाओं को विशेष रूप से टुपल्स का समर्थन करने में सक्षम होने से रोकती हैं।उनमें से हैं कि हम रनटाइम पर टाइप को समझने में सक्षम होना चाहिए और गतिशील एक्सेसर द्वारा मूल्य वापस करने में सक्षम होना चाहिए। यह tuples के साथ काम नहीं करता है। – marius

0

शायद एक छोटे से अक्षम है, लेकिन मेरे लिए काम करता (Int-> स्ट्रिंग से उदाहरण शब्दकोश, आपके उदाहरण के लिए अनुरूप):

class DictObj: Object { 
    var dict : [Int:String] { 
     get { 
     if _keys.isEmpty {return [:]} // Empty dict = default; change to other if desired 
     else { 
      var ret : [Int:String] = [:]; 
      Array(0..<(_keys.count)).map{ ret[_keys[$0].val] = _values[$0].val }; 
      return ret; 
     } 
     } 
     set { 
     _keys.removeAll() 
     _values.removeAll() 
     _keys.appendContentsOf(newValue.keys.map({ IntObj(value: [$0]) })) 
     _values.appendContentsOf(newValue.values.map({ StringObj(value: [$0]) })) 
     } 
    } 
    var _keys = List<IntObj>(); 
    var _values = List<StringObj>(); 

    override static func ignoredProperties() -> [String] { 
     return ["dict"]; 
    } 
} 

क्षेत्र क्योंकि इन नहीं कर रहे 'स्ट्रिंग्स/Ints की एक सूची संग्रहीत नहीं कर सकता

class IntObj: Object { 
    dynamic var val : Int = 0; 
} 

class StringObj: Object { 
    dynamic var val : String = ""; 
} 

सरणियों भंडारण इसी तरह (पोस्ट मुझे वर्तमान में eluding है) के लिए ढेर अतिप्रवाह पर एक और जवाब यहाँ से प्रेरित होकर ...

19

मैं CUR हूँ: टी वस्तुओं, इसलिए "नकली वस्तुओं" बनाना rently इस नकल अपने मॉडल पर एक पर ध्यान नहीं दिया शब्दकोश संपत्ति उजागर द्वारा, एक निजी द्वारा समर्थित, NSData जो शब्दकोश का एक JSON प्रतिनिधित्व समाहित कायम:

class Model: Object { 
    private dynamic var dictionaryData: NSData? 
    var dictionary: [String: String] { 
     get { 
      guard let dictionaryData = dictionaryData else { 
       return [String: String]() 
      } 
      do { 
       let dict = try NSJSONSerialization.JSONObjectWithData(dictionaryData, options: []) as? [String: String] 
       return dict! 
      } catch { 
       return [String: String]() 
      } 
     } 

     set { 
      do { 
       let data = try NSJSONSerialization.dataWithJSONObject(newValue, options: []) 
       dictionaryData = data 
      } catch { 
       dictionaryData = nil 
      } 
     } 
    } 

    override static func ignoredProperties() -> [String] { 
     return ["dictionary"] 
    } 
} 

यह सबसे कारगर तरीका नहीं हो सकता है, लेकिन यह मुझे अनुमति देता है मेरे स्थानीय दायरे मॉडल में आने वाले JSON डेटा को तेज़ी से और आसानी से मानचित्रित करने के लिए Unbox का उपयोग जारी रखने के लिए।

+0

इसे साझा करने के लिए धन्यवाद। मुझे ठीक लगता है। –

+1

कृपया अतिरिक्त JSON (डी-) क्रमबद्धता के प्रदर्शन प्रभाव से अवगत रहें और इस तरह से आप शब्दकोश पर क्वेरी करने की क्षमता को खो देते हैं। – marius

+0

हाय @ मैरियस, ज़ाहिर है। यह एक कामकाज है और जैसा कि मैंने कहा, ऐसा करने का सबसे प्रभावी तरीका नहीं है, लेकिन यह उन मामलों के लिए काम करता है जहां मुझे अपने दायरे पर एक शब्दकोश संदर्भ होना चाहिए (जिसे मुझे वास्तव में पूछने की आवश्यकता नहीं है)। उम्मीद है कि हमें कुछ बिंदुओं पर शब्दकोशों के लिए मूल समर्थन देखना होगा, इस मामले में अब इसकी आवश्यकता नहीं होगी। – boliva

-1

मैं शब्दकोश को वास्तविक में JSON स्ट्रिंग के रूप में सहेजता हूं। फिर JSON को पुनः प्राप्त करें और शब्दकोश में कनवर्ट करें। नीचे एक्सटेंशन का प्रयोग करें।

extension String{ 
func dictionaryValue() -> [String: AnyObject] 
{ 
    if let data = self.data(using: String.Encoding.utf8) { 
     do { 
      let json = try JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.allowFragments) as? [String: AnyObject] 
      return json! 

     } catch { 
      print("Error converting to JSON") 
     } 
    } 
    return NSDictionary() as! [String : AnyObject] 
} } 

और

extension NSDictionary{ 
    func JsonString() -> String 
    { 
     do{ 
     let jsonData: Data = try JSONSerialization.data(withJSONObject: self, options: .prettyPrinted) 
     return String.init(data: jsonData, encoding: .utf8)! 
     } 
     catch 
     { 
      return "error converting" 
     } 
    } 
} 
संबंधित मुद्दे

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