2010-05-17 17 views
9

मैं ऐसे ऐप पर काम कर रहा हूं जो SQL डेटा को SQLite रिकॉर्ड्स प्रबंधित करने के लिए बैकएंड के रूप में उपयोग करता है। मेरे पास तारों और संख्याओं के साथ काम कर रहा सब कुछ है, लेकिन बस बस फ़ील्ड जोड़ने की कोशिश की है और चीजों को काम करने के लिए प्रतीत नहीं होता है।कोर डेटा और बूल सेटअप

.xcdatamodel में, मैंने isCurrentlyForSale नामक मेरी ऑब्जेक्ट में एक फ़ील्ड जोड़ा है जो वैकल्पिक नहीं है, क्षणिक नहीं है, और अनुक्रमित नहीं है। गुण का प्रकार डिफ़ॉल्ट मूल्य संख्या के साथ बूलियन पर सेट है।

जब मैं डाटा मॉडल से वर्ग फ़ाइलों बनाया, बॉयलरप्लेट कोड ज शीर्षक में इस संपत्ति के लिए जोड़ा गया था:

@property (nonatomic, retain) NSNumber * isCurrentlyForSale; 

@dynamic isCurrentlyForSale; 

के साथ

मीटर में कार्यान्वयन फ़ाइल।

मैंने हमेशा बुलियन के साथ सरल बूल के रूप में काम किया है। मैंने पढ़ा है कि मैं NSNumber के numberWithBool और boolValue विधियों का उपयोग कर सकता हूं, लेकिन यह कुछ आसान के लिए अतिरिक्त कोड की तरह लगता है।

क्या हेडर में @property को एक साधारण BOOL में बदल दिया जा सकता है? यदि ऐसा देखने के लिए कुछ भी है?

धन्यवाद -जॉन

उत्तर

2

सरल प्रतिक्रिया: नहीं, आप एक BOOL वापस जाने के लिए @property घोषणा नहीं बदल सकते।

हालांकि, आप कुछ साधारण रैपर लिख सकते हैं। मैं currentlyForSale को विशेषता (जो यह currentlyForSale और setCurrentlyForSale: उत्पन्न करता है इसका मतलब है) का नाम बदलने चाहते हैं, और फिर दो रैपर लिखें:

- (BOOL) isCurrentlyForSale { 
    return [[self currentlyForSale] boolValue]; 
} 

- (void) setIsCurrentlyForSale:(BOOL)forSale { 
    [self setCurrentlyForSale:[NSNumber numberWithBool:forSale]]; 
} 
+0

एक सेटर और न ही संपत्ति में "है" होना चाहिए। यही कारण है कि '@ संपत्ति' में 'गेटर =' सेटिंग है। और हाँ, कोर डेटा का हिस्सा होने वाले आदिम एक्सेसर्स का उपयोग करके आप '@ property' को BOOL में बदल सकते हैं। –

+0

@ मार्कस हां, मुझे पता है कि सेटर्स में 'आईएस' नहीं होना चाहिए, लेकिन मैंने इसे इसलिए रखा क्योंकि 'सेट वर्तमान में फोर्ससेल:' पहले ही सीडी द्वारा लिया गया था (और मुझे 'गेटर = 'और' सेटर = 'के बारे में पता है। और क्या आप कह रहे हैं कि आप हेडर में 'NSNumber * '' BOOL' को बदल सकते हैं और यह काम करेगा?वह * निश्चित रूप से * मुझे आश्चर्य होगा। –

30

जबकि डेव डीलॉन्ग के जवाब करीब है, आप वास्तव में का नाम बदलने के बिना ऐसा कर सकते हैं संपत्ति।

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

सबसे पहले अपने @property के रूप में परिभाषित किया जाना चाहिए: के बजाय एक @dynamic संपत्ति घोषित करने की,

@property (nonatomic, getter=isCurrentlyForSale) BOOL currentlyForSale; 
फिर अपने कार्यान्वयन फ़ाइल में

, सीधे accessors पैदा करते हैं।

- (BOOL)isCurrentlyForSale 
{ 
    [self willAccessValueForKey:@"currentlyForSale"]; 
    BOOL b = [[self primitiveValueForKey:@"currentlyForSale"] boolValue]; 
    [self didAccessValueForKey:@"currentlyForSale"]; 
    return b; 
} 

- (void)setCurrentlyForSale:(BOOL)b 
{ 
    [self willChangeValueForKey:@"currentlyForSale"]; 
    [self setPrimitiveValue:[NSNumber numberWithBool:b] forKey:@"currentlyForSale"]; 
    [self didChangeValueForKey:@"currentlyForSale"]; 
} 

इन एक्सेसर्स के साथ आपकी ऑब्जेक्ट आपके लिए मुक्केबाजी को संभालेगी और आप इसे आदिम मूल्य के रूप में एक्सेस कर सकते हैं। साथ ही, setIs से शुरू होने वाला एक सेटर एक अच्छा विचार नहीं है, इसलिए इसे उदाहरण कोड में हटा देना।

+0

+1 आह, मैं अब जो कह रहा हूं उसे प्राप्त करता हूं। मैंने सोचा था कि आप यह कह रहे थे कि आप '@ property' को 'BOOL' में बदल सकते हैं और कस्टम विधियों को लागू नहीं कर सकते हैं। एक तरफ के रूप में, सेटर थोड़ा गलत है। '(होगा | किया गया) ChangeValueForKey: 'केवल नए मूल्य वास्तव में अलग होने पर ही लागू किया जाना चाहिए (यानी, आपको एक कथन की आवश्यकता है)। –

+0

उत्कृष्ट उदाहरण और स्पष्टीकरण - धन्यवाद मार्कस! –

+0

एकमात्र चीज जो मैं जोड़ूंगा, वह है कि मैं मुख्य नामों के लिए एनएसएसटींग स्थिरांक का उपयोग करना पसंद करता हूं, यह बाद में टाइपोग्राफ़िकल त्रुटियों को शूट करने में परेशानी से बचाता है। 'एनएसएसटींग * कॉन्स वर्तमान में फोर्ससेल = @" वर्तमान में फोर्ससेल ";' – Eric