आप KVC का उपयोग करना होगा। लेकिन यह करने के बारे में कैसे जाना है? आखिरकार, एनएसएमयूटेबलएरे अपने उत्परिवर्तन विधियों या सामग्रियों के परिवर्तनों के लिए कुंजी-मूल्य-कोडिंग अनुपालन नहीं है। जवाब proxying है- एनएस subclassing [Mutable] ऐरे एक परेशानी का बहुत अधिक है।
एनएसपीरोक्सी एक महान छोटी कक्षा है जिसका उपयोग आप अपने सरणी में भेजे गए संदेशों को अवरुद्ध करने के लिए कर सकते हैं जैसे कि आप एक एनएसएमयूटेबलएरे थे, फिर उन्हें कुछ आंतरिक उदाहरण पर अग्रेषित करें। दुर्भाग्य से, यह केवीसी अनुपालन भी नहीं है, क्योंकि केवीसी की कमी एनएसओब्जेक्ट में रहती है। हमें इसका उपयोग करना होगा, फिर। एक नमूना इंटरफेस कुछ इस तरह दिख सकता है:
@interface CFIKVCMutableArrayProxy : NSObject {
NSMutableArray *_innerArray;
}
- (NSUInteger)count;
- (void)insertObject:(id)anObject atIndex:(NSUInteger)index;
- (void)removeObjectAtIndex:(NSUInteger)index;
- (void)addObject:(id)anObject;
- (void)removeLastObject;
- (void)insertObjects:(NSArray *)objects atIndexes:(NSIndexSet *)indexes;
- (void)replaceObjectAtIndex:(NSUInteger)index withObject:(id)anObject;
//…
@end
आप देख सकते हैं, हम NSMutableArray
के लिए एक इंटरफेस है, जो आवश्यक है, के रूप में हमारे प्रॉक्सी सब कुछ को लागू करना चाहिए, जैसे कि यह एक NSMutableArray
थे अनुकरण कर रहे हैं। यह कार्यान्वयन को यथासंभव सरल बनाता है, क्योंकि हम केवल चयनकर्ताओं को हमारे आंतरिक NSMutableArray
पॉइंटर पर अग्रेषित कर सकते हैं।
@implementation CFIKVCMutableArrayProxy
//…
- (NSUInteger)count {
return _innerArray.count;
}
- (void)addObject:(id)anObject {
[self willChangeValueForKey:@"count"];
[_innerArray addObject:anObject];
[self didChangeValueForKey:@"count"];
}
- (void)removeLastObject {
[self willChangeValueForKey:@"count"];
[_innerArray removeLastObject];
[self didChangeValueForKey:@"count"];
}
@end
आप इस तरह एक सरणी रैप करने के लिए कोई अवसर है, तो फिर से सोचने के लिए अपने कोड की कोशिश: संक्षिप्तता के लिए, मैं केवल आप को दिखाने के लिए एक सामान्य रूपरेखा कैसा दिखाई देता है दो तरीकों को लागू करेंगे । यदि बाहरी निर्भरता आपको इस तरह के कोने में मजबूर कर रही है, तो इसे हटाने का प्रयास करें। अपने उपकरणों के आसपास काम करना हमेशा एक बुरी चीज है।
मैं इस पर 100% नहीं हूं, लेकिन एक सरणी के लिए एक कीपैथ और प्रत्यय '@ count' इस मान को प्राप्त करने के लिए केवीसी तरीका है। तो शायद आप केवीओ 'सरणी @ गिनती' देख सकते हैं? https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/KeyValueCoding/Articles/CollectionOperators.html#//apple_ref/doc/uid/20002176-BAJEAIEE – joerick