तो मैं कुछ ऐसा खेल रहा था जहां रन का समय तक तर्क का वर्ग प्रकार अज्ञात है। इस तरह:तर्क है किंडोफ क्लास: [एनएसएनंबर कक्षा] - यह जांचने के लिए रास्ता?
- (NSNumber *)doWhatever:(id)arg
{
// this ALWAYS FAILS
if ([arg isKindOfClass:[NSNumber class]]) {
return arg;
}
else {
// what was it???
NSLog("arg klass=%@", [arg class]); // prints NSCFNumber
}
// This check works correctly.
if ([arg isKindOfClass:[NSArray class]]) {
for (id x in arg) {
NSNumber *result = [self doWhatever:x];
if (result) {
return result;
}
}
}
return nil;
}
- (void)someMethod
{
NSArray *myArray = [NSArray arrayFromObjects:[NSNumber numberWithInt:3], nil]];
NSNumber *myNum = [self doWhatever:myArray];
NSLog(@"myNum=%@", myNum);
}
यह स्पष्ट रूप से मैं क्या कर रहा हूँ की एक काल्पनिक उदाहरण है। बिंदु यह है कि यह कभी भी काम नहीं करता है बी/सी "तर्क" की कक्षा हमेशा एनएससीएफएनंबर के रूप में दिखाई देती है, और मैं इसकी जांच करने का कोई तरीका नहीं समझ सकता।
यह पता लगाने के लिए कम भ्रमित करने का कोई तरीका है कि किसी सरणी में मनमाना मान एक पूर्णांक है या नहीं?
धन्यवाद, जेमी
अद्यतन: हाय दोस्तों। आपकी मदद के लिए धन्यवाद @chuck, @omz, और @ निकिता लियोनोव। जो मैंने यहां पोस्ट किया था वह मूल रूप से उस समस्या का सरलीकरण था जो मैंने किया था और इसे पहले चलाने के बिना यहां लिखा था। उस कोड को त्रुटियों को हटाने के लिए एक बार अपडेट किया गया (नीचे देखें) वास्तव में ठीक चलाता है।
मेरे वास्तविक कोड में जो गलती हुई थी, उसमें हुई गलती समान रूप से मूर्ख थी - मैं सरणी को इंडेक्स में आइटम के बजाय "डू जो भी" में वापस भेज रहा था, यही कारण है कि मुझे समस्याएं थीं।
मदद करने की कोशिश करने के लिए धन्यवाद, हालांकि मेरे प्रश्न को गुमराह किया गया था ... हर किसी के समय बर्बाद करने के लिए खेद है!
जेमी
सही कोड है कि वांछित के रूप में चलाता है:
- (NSNumber *)doWhatever:(id)arg
{
// this NOW WORKS
if ([arg isKindOfClass:[NSNumber class]]) {
return arg;
}
else {
// what was it???
NSLog(@"arg klass=%@", [arg class]); // prints NSCFNumber
}
// This check works correctly.
if ([arg isKindOfClass:[NSArray class]]) {
for (id x in arg) {
NSNumber *result = [self doWhatever:x];
if (result) {
return result;
}
}
}
return nil;
}
- (void)someMethod
{
NSArray *myArray = [NSArray arrayWithObjects:
[NSNumber numberWithInt:1],
[NSNumber numberWithInt:2],
[NSNumber numberWithInt:3],
[NSNumber numberWithInt:4],
nil];
NSNumber *myNum = [self doWhatever:myArray];
NSLog(@"myNum=%@", myNum);
}
क्या आप वाकई एक सरणी बनाते हैं? मैंने निम्नलिखित कोड लिखा है IKindOfClass इस मामले में अच्छी तरह से काम करता है: NSNumber * संख्या = [NSNumber संख्या WithFloat: 0.5]; यदि ([संख्या isKindOfClass: [NSNumber क्लास]]) { एनएसएलओजी (@ "NSNumebr"); } –
आपके "कुछ तरीकों से ओएस में दिखाए गए सरणी की जांच प्रारंभिक है IKindOfClass कॉल के लिए अपेक्षित काम करता है। –
क्या आपने वास्तव में इस सटीक कोड का उपयोग किया था? कोई 'arrayFromObjects:' विधि नहीं है, इसे 'arrayWithObjects:' कहा जाता है। इसके अलावा कि, इसे 'NSCFNumber' के बजाय' NSCFArray' (या कुछ समान) काम करना और मुद्रित करना चाहिए। – omz