Преобразование NSNumber в NSString не является строкой - PullRequest
1 голос
/ 19 мая 2011

У меня проблема с преобразованием значения NSNumber в NSString

MyPowerOnOrNot - это NSNumber, ведьма может вернуть только 1 или 0, а myString - это NSString..

myString = [NSString stringWithFormat:@"%d", [myPowerOnOrNot stringValue]];

NSLog(@"%@",myString);
if(myString == @"1") {
    [tablearrayPOWERSTATUS addObject:[NSString stringWithFormat:@"%@",@"ON"]];
}
else if(myString == @"0") {
    [tablearrayPOWERSTATUS addObject:[NSString stringWithFormat:@"%@",@"OFF"]];
}

Что с этим не так?

NSLog показывает 0 или 1 в консоли в виде строки, но я не могу проверить, если это 1 или 0 воператор if?

If не входит в операторы, когда это действительно должно быть ... Я действительно не понимаю, почему это не работает .. Любая помощь будет очень полезной!

Ответы [ 3 ]

7 голосов
/ 19 мая 2011

Пара проблем

myString = [NSString stringWithFormat:@"%d", [myPowerOnOrNot stringValue]];

-stringValue , отправленная на NSNumber, дает вам ссылку на строку.Спецификатор формата %d предназначен для типа C int.В этом случае произойдет то, что myString будет содержать адрес строки NSString, возвращенной [myPowerOnOrNot stringValue].Или на 64-битном он вернул бы половину этого адреса.Вы могли бы использовать [myPowerOnOrNot stringValue] напрямую и избежать относительно дорогих -stringWithFormat:

if(myString == @"1")

myString и @"1" - это не обязательно один и тот же объект.Ваше условие только проверяет, что ссылки идентичны.В общем случае с Objective-C вы должны использовать -isEqual: для равенства объектов, но, поскольку мы знаем, что это строки, вы можете использовать -isEqualToString:

if ([[myPowerOnOrNot stringValue] isEqualToString: @"1"])

Или даже лучше сделать числовое сравнение вашихNSNumber преобразуется в целое число.

if ([myPowerOnOrNot intValue] == 1)

Наконец, если myPowerOnOrNot не должен иметь никакого значения, кроме 0 или 1, рассмотрите возможность использования перехвата else, который утверждает или выдает исключение на всякий случай myPowerOnOrNot случайно ошибся.

1 голос
/ 19 мая 2011

«myString» - это ссылка на строку, а не значение самой строки.

Оператор == сравнивает ссылку с вашим строковым литералом и поэтому никогда не возвращает true.

Вместо этого используйте

 if( [myString isEqualToString:@"1"] )

Это сравнит значение myString с "1"

0 голосов
/ 19 мая 2011

В Задаче C;Вы не можете сравнивать строки на равенство, используя оператор ==.

Здесь вы хотите сделать следующее:

[tablearrayPOWERSTATUS addObject:([myPowerOnOrNot integerValue]?@"ON":@"OFF"])];

Компактно, быстро, вкусно.

...