5

Więc grałem z czymś, gdzie typ klasy arg jest nieznany do czasu wykonania. tak:argument isKindOfClass: [NSNumber class] - rozsądny sposób, aby to sprawdzić?

- (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); 
} 

Jest to oczywiście wymyślony przykład co usiłuję zrobić. Chodzi o to, że nigdy nie działa b/c klasa "arg" zawsze pojawia się jako NSCFNumber i nie mogę znaleźć sposobu, aby to sprawdzić.

Dowolny sposób, aby wykluczyć, czy arbitralna wartość w tablicy jest liczbą całkowitą, czy nie jest mniej myląca?

Dzięki, Jamie


UPDATE: Hi guys. Dzięki @chuck, @omz i @Nikita Leonov za pomoc. To, co tutaj zamieściłem, było tylko uproszczeniem problemu, który miałem, i napisałem go tutaj bez uruchamiania go jako pierwszego. Ten kod raz zaktualizowany w celu usunięcia błędów (patrz poniżej) działa poprawnie.

Błąd, który popełniłem w moim prawdziwym kodzie, z którym miałem problemy, był równie głupi - przekazywałem tablicę z powrotem do "doWhoothing" zamiast do elementu w indeksie tablicy, dlatego miałem problemy.

Dzięki za pomoc, jakkolwiek moje pytanie było błędne ... Przepraszamy za zmarnowanie czasu dla wszystkich!

Jamie

Poprawiono kod, który działa zgodnie z oczekiwaniami:


- (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

Czy jesteś pewien, że zbudowałeś tablicę w taki sposób? Napisałem następujący kod: isKindOfClass działa dobrze w tym przypadku: NSNumber * number = [NSNumber numberWithFloat: 0,5]; if ([liczba toKindOfClass: [klasa NSNumber]]) { NSLog (@ "NSNumebr"); } –

+1

Sprawdzone inicjowanie tablicy, jak pokazano w twoim "someMethod do os, działa również zgodnie z oczekiwaniami dla wywołania isKindOfClass –

+1

Czy naprawdę używasz tego kodu? Nie ma metody' arrayFromObjects: ', nazywa się ona' arrayWithObjects: '. to powinno działać i wydrukować 'NSCFArray' (lub coś podobnego) zamiast' NSCFNumber'. – omz

Odpowiedz

10

NSCFNumber jest podklasą NSNumber. Dopóki używasz isKindOfClass: zamiast isMemberOfClass: lub [arg class] == [NSNumber class], powinno działać. Jeśli nie, twój problem jest gdzie indziej.

Powiązane problemy