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);
}
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"); } –
Sprawdzone inicjowanie tablicy, jak pokazano w twoim "someMethod do os, działa również zgodnie z oczekiwaniami dla wywołania isKindOfClass –
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