2015-03-18 4 views
45

की संपत्ति के रूप में enum का उपयोग करना क्या मेरे मॉडल के लिए एक संपत्ति के रूप में Enum का उपयोग करना संभव है? मैं वर्तमान में इस तरह एक वर्ग है:रीयल मॉडल

class Checkin: RLMObject { 
    dynamic var id: Int = 0 
    dynamic var kind: String = "checked_in" 
    var kindEnum: Kind = .CheckedIn { 
    willSet { self.kind = newValue.rawValue } 
    } 

    enum Kind: String { 
    case CheckedIn = "checked_in" 
    case EnRoute = "en_route" 
    case DroppedOff = "dropped_off" 
    } 
    .... 
} 

यह ठीक काम करता है, लेकिन मैं kind संपत्ति Enum हो सकता है और क्षेत्र स्वचालित रूप से संपत्ति पर .rawValue फोन है जब यह एक वस्तु की बचत है करने में सक्षम होना चाहते हैं स्टोर करने के लिए। क्या यह रीयलम में संभव है या इसके लिए पहले से ही एक सुविधा अनुरोध है?

उत्तर

73

आप ओवरराइड करना चाहिए अपने kindEnum के सेटर और इस मामले के लिए गेटर:

enum Kind: String { 
    case CheckedIn 
    case EnRoute 
    case DroppedOff 
} 

class Checkin: Object { 
    dynamic var id = 0 
    dynamic var kind = Kind.CheckedIn.rawValue 
    var kindEnum: Kind { 
    get { 
     return Kind(rawValue: kind)! 
    } 
    set { 
     kind = newValue.rawValue 
    } 
    } 
} 
+1

बहुत अच्छा होगा नहीं है। – Shmidt

+0

यह अच्छा नहीं है। आप ऐसा क्यों नहीं कर सकते ?: http://stackoverflow.com/questions/26900302/swift-storing-states-in-coredata-with-enums (मार्टिन क्रेनेक उत्तर)? – Rob

+1

आप रीयलम के साथ सीधे '@ objc' enums का उपयोग कर सकते हैं, लेकिन यह' स्ट्रिंग 'संबंधित मानों के साथ स्विफ्ट एनम्स के लिए काम नहीं करेगा। – jpsim

28

मैं थोड़ा और आगे इस मॉडल को परिष्कृत किया है।

enum Thing: String { 
    case Thing1 
    case Thing2 
    case Thing3 
} 
मेरी क्षेत्र वर्ग वस्तु में

तो:

class myClass : Object { 
    private dynamic var privateThing = Thing.Thing1.rawValue 
    var thing: Thing { 
     get { return Thing(rawValue: privateThing)! } 
     set { privateThing = newValue.rawValue } 
    } 
} 

यह हमें

myClassInstance.thing = .Thing1 

(भंडारण privateThing में "Thing1") लिखने की अनुमति देता है, लेकिन

myClassInstance.privateThing = "Thing4" 
की टाइपिंग से बचाता है

जो वैध मान नहीं है डेटा अखंडता को संरक्षित करना।

+0

नाम दिया अद्यतन: मैंने अपना मूल कोड संपादित किया है क्योंकि = "Thing1" इत्यादि अनावश्यक है स्विफ्ट अपने कच्चे वैल्यू के मामले के स्ट्रिंग शाब्दिक समकक्ष का उपयोग करता है, जो कि भी बेहतर है और हम कच्चे वैल्यू का उपयोग डिफ़ॉल्ट को सेट करने के लिए कर सकते हैं जो अधिक विश्वसनीय और क्लीनर है। :-) –

+0

इस अतिरिक्त के लिए धन्यवाद, मुझे वाकई यह जवाब पसंद है। +1 – dehlen

7

के बाद से क्षेत्र समर्थन ऑब्जेक्टिव-सी enums और वे Int द्वारा प्रदर्शनीय हैं तो आप इस का उपयोग कर सकते हैं:

class Checkin: Object { 
    dynamic var id: Int = 0 
    dynamic var kind: Kind = .checkedIn 

    @objc enum Kind: Int { 
    case checkedIn 
    case enRoute 
    case droppedOff 
    } 
    .... 
} 

आप के लिए/String से आप Kind के लिए एक कस्टम प्रारंभकर्ता और एक toString समारोह का उपयोग कर सकते पार्स करने के लिए की जरूरत है ।

GitHub

में इस बारे में चर्चा यह स्विफ्ट 3.0 साथ काम करता है और क्षेत्र अगर आप अपने आधिकारिक उदाहरण के लिए इस नमूने जोड़ सकता है 2.0.2

+0

यदि आपके पास 'Int' enum है, तो अच्छा समाधान है, लेकिन यह नहीं देखता कि यह इसके बजाय' स्ट्रिंग' के साथ कैसे काम कर सकता है। 'Kind' को एक उद्देश्य-सी enum में परिवर्तित किया गया है जो कस्टम प्रारंभकर्ताओं या संग्रहीत गुणों का समर्थन नहीं करता ..? –

+0

वास्तव में, मुझे कोई समाधान नहीं मिला है जो किसी भी प्रकार के साथ काम करता है लेकिन 'Int' –

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