2015-01-03 3 views
0

Попытка создания метода только с одним параметром, который может принимать NSString или int.Создание метода с параметром, который принимает NSString или int

Вот что я сделал до сих пор:

-(NSString*)LocalizeNumber:(void*)TheNumber{ 
    BOOL IsVarInt = false; 
    NSString * Num = ""; 
    if(IsVarInt){ 
     Num = [NSString stringWithFormat:@"%i",(int)TheNumber]; 
    }else{ 
     Num = [NSString stringWithFormat:@"%@",(__bridge NSString*)TheNumber]; 
    } 
    //rest of code... 
} 

И это, как я называю этот метод:

если прохождение INT:

[self LocalizeNumber:(void*)150]; 

если проходящее NSString:

[self LocalizeNumber:@"150"]; 

Проблема что я до сих пор не знаю, как узнать, является ли параметр «TheNumber» NSString или int.

спасибо.

+1

Первый способ передачи 'int' не будет работать. Почему у вас нет двух разных методов, один из которых принимает строку, а другой - целое число? – SevenBits

+0

@SevenBits Спасибо за подсказку, я закончу это, если нет возможности использовать один параметр. Кстати, передача int работает, я ее протестировал. – Porizm

+0

Он может работать в этом случае (не проверял его), но во многих случаях он будет терпеть неудачу. Это должно быть сделано правильно, либо с помощью метода, который я предложил, либо с помощью 'va_list'. – SevenBits

ответ

3

Хотя я предлагаю вам пересмотреть свой подход, ваша цель может быть достигнута следующим образом:

- (NSString *)localizeNumber:(id)number { 
    NSString *num = nil; 

    if ([number isKindOfClass:[NSNumber class]]) { 
     num = [number stringValue]; 
    } else if ([number isKindOfClass:[NSString class]]) { 
     num = number; 
    } else { 
     // oops - bad value 
    } 

    // rest of code using num 
} 

Затем вы можете вызвать метод следующим образом:

NSString *someString = @"Hello"; 
NSString *result = [self localizeNumber:someString]; 

или:

int someInt = 42; 
NSString *result = [self localizeNumber:@(someInt)]; 
+0

Спасибо за сообщение, как вызвать метод. – Porizm

+0

FYI, это работает только потому, что 'int' преобразуется в объект' NSNumber' компилятором, используя оператор '@'. – SevenBits

1

Вы не можете указать между типом объекта и простым примитивом. Тем не менее, вы можете легко сказать, между двумя типами объектов, если вы передаете int прошел в NSNumber обертку, как это:

-(NSString*)LocalizeNumber:(id)TheNumber { 
    NSString *Num = @""; 
    if ([TheNumber isKindOfClass:[NSSTRING class]]) { 
     Num = [NSString stringWithFormat:@"%@", TheNumber]; 
    } else if ([TheNumber isKindOfClass:[NSNumber class]]) { 
     Num = [NSString stringWithFormat:@"%i",[TheNumber intValue]]; 
    } 
    //rest of code... 
} 
-2

Вы можете использовать категории, чтобы добавить -stringValue к NSString:

@implementation NSString (LocalizedNumber) 
-(NSString*)stringValue 
{ 
    return self ; 
} 
@end 

Тогда вы можете позвонить:

NSString * localizedNumber = [<number or string object> stringValue] 

Ther e не является безопасным способом рассказать int от NSString ссылка.

+0

Это не помогает OP вообще. Вы возвращаете другую строку. Как это помогает OP получить целое число? – SevenBits

+0

Его исходный код возвращает строку. Я не понимаю, к чему вы клоните. Ему нужен код, который работает для строк или цифр - это так. Просто назовите * -stringValue * на все, что у вас есть. Эта категория заставляет ее работать для * NSString *, и она уже работает для * NSNumber *. – nielsbot

+0

Вы также можете использовать собственный метод и добавить его как в NSNumber, так и в NSString – nielsbot

Смежные вопросы