Bu nedenle, çalışma zamanına kadar arg türünün sınıfının bilinmediği bir şeyle oynuyordum. Böyle :argümanıKindOfClass: [NSNumber sınıfı] - Bunu kontrol etmek için bir yol mu?
- (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);
}
Bu açıkçası yapmaya çalışıyorum şeyin yapmacık bir örnektir. Bu, hiçbir zaman "arg" sınıfının her zaman NSCFNumber olarak göründüğü şekilde çalışmaz ve bunu kontrol etmenin bir yolunu anlayamıyorum.
Bir dizideki rasgele bir değerin tam sayı olup olmadığını algılamak için daha az kafa karıştırıcı yapmanın herhangi bir yolu var mı?
sayesinde Jamie
GÜNCELLEME: Merhaba çocuklar. Yardımlarınız için @chuck, @omz ve @Nikita Leonov'a teşekkürler. Buraya ilk gönderdiğim şey, sadece sahip olduğum sorunun basitleştirilmesiydi ve önce onu çalıştırmadan yazdı. Bu kodu hataları kaldırmak için bir kez güncellendi (aşağıya bakın) aslında iyi çalışır.
Gerçek kodumda yaptığım hata, eşit derecede aptalca idi - diziyi dizinin dizinindeki dizinin yerine "doWhatever" değerine geri gönderiyordum, bu yüzden sorun yaşıyorum.
Yardım etmeye çalıştığınız için teşekkürler, ancak yanlış yönlendirdiğim soru şu ki ... Herkesin zamanını harcadığım için üzgünüm! istenen şekilde çalışır
Jamie
Düzeltilmiş kodu:
- (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);
}
Bu şekilde bir dizi oluşturduğunuzdan emin misiniz? Aşağıdaki kod yazdım bir isKindOfClass bu durumda iyi çalışır: NSNumber * number = [NSNumber numberWithFloat: 0.5]; ([sayı, KindOfClass: [NSNumber sınıfı]]) { NSLog (@ "NSNumebr"); } –
"someMethod to os" da gösterildiği gibi dizinin denetimli olarak başlatılması da isKindOfClass çağrısı için beklendiği gibi çalışır. –
Gerçekten bu kodu kullanmış mıydınız? "ArrayFromObjects:' yöntemi yoktur, buna "arrayWithObjects:" denir. Bu, "NSCFNumber" yerine "NSCFArray" (ya da benzer bir şey) çalışmalı ve yazdırmalıdır. – omz