2016-10-27 5 views
5

मैं दायरे में नया हूं और मैंने स्ट्रिंग के साथ किए गए ऐरे को जोड़ने की कोशिश की और मैं कुछ त्रुटियों के साथ समाप्त हुआ।स्विफ्ट के साथ दायरे में एरे जोड़ें 3

class Sensors : Object { 


    dynamic var name = "" 
    dynamic var message = "" 

    var topic: [String] { 
     get { 
      return _backingNickNames.map { $0.stringValue } 
     } 
     set { 
      _backingNickNames.removeAll() 
      _backingNickNames.append(objectsIn: newValue.map({ RealmString(value: [$0]) })) 
     } 
    } 
    let _backingNickNames = List<RealmString>() 

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




} 

class RealmString: Object { 
    dynamic var stringValue = "" 
} 

यह बहुत अच्छा काम कर रहा है, अब मैं इस वर्ग के अंदर एक और सरणी जोड़ना चाहते हैं: तो एक छोटे से खोज के बाद मैं एक समाधान में पता चला। यदि कोई क्षेत्र के साथ सरणी जोड़ने के किसी अन्य तरीके को जानता है तो कृपया इसे साझा करें।

अग्रिम

+0

सूची का उपयोग करने का क्या समस्या है? – Horst

+0

कोई भी नहीं जैसा कि मैंने कहा है कि मैं नया हूं और मैं अपने सभी विकल्पों को नहीं करता –

उत्तर

9

एक सामान्य नियम के रूप में धन्यवाद इसका इस्तेमाल करने के एक-से-कई बजाय सरणियों का उपयोग कर (क्षेत्र के संग्रह आलसी हैं द्वारा उन्हें अनुकरण करने की कोशिश कर के क्षेत्र द्वारा प्रदान की रिश्ते, वस्तुओं निहित हैं जिस तरह से और अधिक कुशल है सादा स्विफ्ट सरणी के विरोध में केवल तभी तत्काल किया जाता है)।

अपने मामले में, यदि मैं सही तरीके से समझता हूं कि आप क्या करने का प्रयास कर रहे हैं, तो आप _backingNickNames सूची में स्विफ्ट सरणी जोड़ना चाहते हैं।

क्षेत्र के List वर्ग के append(objectsIn:) विधि का उपयोग क्यों नहीं (here देखें), इस तरह:

// Dog model 
class Dog: Object { 
    dynamic var name = "" 
    dynamic var owner: Person? 
} 

// Person model 
class Person: Object { 
    dynamic var name = "" 
    dynamic var birthdate = NSDate(timeIntervalSince1970: 1) 

    let dogs = List<Dog>() 
} 

let jim = Person() 

let dog1 = Dog() 
let dog2 = Dog() 

// here is where the magic happens 
jim.dogs.append(objectsIn: [dog1, dog2]) 

आप विपरीत करने के लिए (किसी सरणी के लिए एक सूची से परिवर्तित) बस करना चाहते हैं:

let dogsArray = Array(jim.dogs) 

• • • • • • • •

अपने own posted solution वापस, आप आसानी से refactor सकता है इसे समायोजित करने के लिए मॉडल। प्रत्येक Sensor ऑब्जेक्ट में कई Topic और कई Message ऑब्जेक्ट संलग्न हो सकते हैं।

बस message और topic अभिकलन गुण खाई और क्रमश: topics और messages को topicV और messageV नाम बदलें। RealmString से Topic और RealmString1 से Message का नाम बदलें।

अब, आप आसानी के माध्यम से पुनरावृति सकता है, कहते हैं, विषयों एक सेंसर करने के लिए इस तरह संलग्न:

for topic in sensor1.topics { ... } 

या आप (एक सेंसर आप कुछ इस तरह कर सकता है के लिए एक संदेश संलग्न करने के लिए चाहते हैं, तो डॉन ' टी properly add को डीबी के लिए नव निर्मित वस्तु मत भूलना पहले):

let message1 = Message() 
message1.stringValue = "Some text" 

sensor2.messages.append(message1) 

तो, मध्यस्थ स्विफ्ट सरणी उपयोग करने की आवश्यकता।

+0

उत्तर के लिए धन्यवाद मैं जांचूंगा और देख सकता हूं कि मैं यही चाहता हूं कि –

+0

@ माइकवोरिसिस: अगर यह किसी भी तरह से आपकी मदद कर रहा है तो बस उत्सुक है। –

+0

असल में थोड़ी सी खोज और परीक्षण के बाद मुझे अंत में समझ में आया कि यह कैसे काम कर रहा है और मुझे आपकी तुलना में अपना रास्ता आसान लगता है, इसलिए मैं आपके प्रश्न को सबसे अच्छे जवाब के रूप में चिह्नित करूंगा! फिर से धन्यवाद! –

0

क्या bogdanf ने कहा है, और जिस तरह से आपने इसे कार्यान्वित किया है वह दोनों सही हैं।

बेसिक मूल्य प्रकार एक तरफ, क्षेत्र कर सकते हैं विलक्षण क्षेत्र Object वस्तुओं के लिए केवल दुकान संदर्भ, साथ ही ObjectList प्रकार का उपयोग कर के सरणियों। इस प्रकार, यदि आप प्रकारों की एक सरणी को सहेजना चाहते हैं, तो किसी भी मूल प्रकार को सहेजना आवश्यक है (जैसे String यहां) सुविधा में रीयल Object

तरह bogdanf ने कहा, इसे फिर से क्षेत्र में परिवर्तित करने मानक स्विफ्ट सरणियों को List रों और वापस, जब से तुम क्षेत्र के आलसी लोडिंग सुविधाओं के लाभ (जो दोनों प्रदर्शन और स्मृति समस्याओं का कारण बन सकता है) खो की सलाह नहीं दी है, लेकिन स्मृति मुद्दों कर सकते हैं कम से कम @autoreleasepool ब्लॉक में रीयलम से डेटा कॉपी करने वाले कोड को संलग्न करके कम करें।

class MyObject: Object { 
    dynamic var childObject: MyObject? 
    let objectList = List<MyObject>() 
} 

तो समीक्षा में, यह जब भी संभव हो List वस्तुओं क्षेत्र के साथ सीधे काम है, और एक क्षेत्र में हर बच्चे को वस्तु के माध्यम से @autoreleasepool किसी भी समय आप वास्तव में करना चाहते हैं उपयोग करने के लिए लूप को अच्छी आदत है। :)

2

परीक्षण के बाद मुझे लगता है कि जैसे एक और सरणी जोड़ने में कामयाब रहे:

class Sensors : Object { 


    dynamic var type = "" 
    dynamic var name = "" 
    dynamic var badge = 0 

    var topic: [String] { 
     get { 
      return topicV.map { $0.stringValue } 
     } 
     set { 
      topicV.removeAll() 
      topicV.append(objectsIn: newValue.map({ RealmString(value: [$0]) })) 
     } 
    } 

    var message: [String] { 
     get { 
      return messageV.map { $0.stringValue1 } 
     } 
     set { 
      messageV.removeAll() 
      messageV.append(objectsIn: newValue.map({ RealmString1(value: [$0]) })) 
     } 
    } 





    let topicV = List<RealmString>() 
    let messageV = List<RealmString1>() 

    override static func ignoredProperties() -> [String] { 
     return ["topic", "message"] 
    } 




} 

class RealmString: Object { 
    dynamic var stringValue = "" 
} 

class RealmString1: Object { 
    dynamic var stringValue1 = "" 
} 
+0

माइक, यह बहुत स्पष्ट नहीं है कि आप रीयलम सूचियों और स्विफ्ट Arrays के बीच आगे और क्यों परिवर्तित करते हैं? यह बहुत अक्षम है और आपके कोड में अनावश्यक जटिलता जोड़ता है। –

+0

मुझे समझ में नहीं आया कि मैं अन्य तरीकों का उपयोग कैसे कर सकता हूं –

+0

मैंने अपने मॉडल को पूर्ण दायरे ऑब्जेक्ट्स और रिश्तों का उपयोग करने का लाभ उठाने के लिए अपने कोड को सही तरीके से रिफैक्टर करने का एक संभावित तरीका दिखाने के लिए अपना उत्तर अपडेट किया है। –

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