5

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); 
} 
+1

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"); } –

+1

"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. –

+1

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

cevap

10

NSCFNumber NSNumber bir alt sınıfıdır. isMemberOfClass: veya [arg class] == [NSNumber class] yerine isKindOfClass: kullanıyor olmanız koşuluyla, çalışmalıdır. Eğer değilse, probleminiz başka bir yerde.