int stringWithFormat для возвращаемого значения NSString - PullRequest
1 голос
/ 18 ноября 2010

У меня есть int currentFontSize, где я хочу сравнить с NSString, хранящимся в массиве C, вот код.

int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    static NSString* fontSizeName[] = 
    {
        @"14",
        @"18",
        @"22",
        @"26",
        @"30",
        @"34",
    };

    int fontSizeSegmentID;
    int currentFontSize = 22;

    NSString *val = [NSString stringWithFormat: @"%i", currentFontSize];
    NSString *val2 = @"22";
    NSLog(@"the current font size is %i", currentFontSize);
    NSLog(@"the current font Value1 is %i", val);
    NSLog(@"the current font Value2 is %i",val2);
    int i;
    for (i = 0; i < 6; i++) {

        NSLog(@"fontSizeNAme:%d",fontSizeName[i]);
        NSLog(@"val:%d",val);

            if (fontSizeName[i] == val) {
                NSLog(@"They are equal");
                fontSizeSegmentID = i;
                break;
            }

            NSLog(@"the fontSizeSegmentID is: %i" , fontSizeSegmentID);
        }

    [pool drain];
    return 0;
}

часть strage, val возвращает мне значение 1879919632, что делаетмое сравнение не удалось.Странная часть, когда я жестко кодирую строку NSString как val2 = @ "22", сравнение становится успешным, где val2 равно: 4240, оно совпадает с:

NSLog(@"fontSizeNAme:%d",fontSizeName[i]);

, вот мое возвращение в NSLog:

2010-11-18 16:56:52.784 testINT[26034:a0f] the current font size is 22
2010-11-18 16:56:52.786 testINT[26034:a0f] the current font Value1 is 1879919632
2010-11-18 16:56:52.787 testINT[26034:a0f] the current font Value2 is 4240
2010-11-18 16:56:52.788 testINT[26034:a0f] fontSizeNAme:4176
2010-11-18 16:56:52.788 testINT[26034:a0f] val:1879919632
2010-11-18 16:56:52.788 testINT[26034:a0f] the fontSizeSegmentID is: 32767
2010-11-18 16:56:52.789 testINT[26034:a0f] fontSizeNAme:4208
2010-11-18 16:56:52.789 testINT[26034:a0f] val:1879919632
2010-11-18 16:56:52.790 testINT[26034:a0f] the fontSizeSegmentID is: 32767
2010-11-18 16:56:52.790 testINT[26034:a0f] fontSizeNAme:4240
2010-11-18 16:56:52.790 testINT[26034:a0f] val:1879919632
2010-11-18 16:56:52.791 testINT[26034:a0f] the fontSizeSegmentID is: 32767
2010-11-18 16:56:52.791 testINT[26034:a0f] fontSizeNAme:4272
2010-11-18 16:56:52.791 testINT[26034:a0f] val:1879919632
2010-11-18 16:56:52.792 testINT[26034:a0f] the fontSizeSegmentID is: 32767
2010-11-18 16:56:52.792 testINT[26034:a0f] fontSizeNAme:4304
2010-11-18 16:56:52.792 testINT[26034:a0f] val:1879919632
2010-11-18 16:56:52.793 testINT[26034:a0f] the fontSizeSegmentID is: 32767
2010-11-18 16:56:52.793 testINT[26034:a0f] fontSizeNAme:4336
2010-11-18 16:56:52.794 testINT[26034:a0f] val:1879919632
2010-11-18 16:56:52.794 testINT[26034:a0f] the fontSizeSegmentID is: 32767

Кто-нибудь может объяснить, почему?почему я приводил @ "22" NString и одна форма int возвращает другое значение ?????Спасибо!

Ответы [ 2 ]

6 голосов
/ 18 ноября 2010

В Objective-C вы не можете просто сравнить int и NSString*, которые содержат строковое представление целого числа. Чтобы конвертировать между двумя, вам нужно сделать

NSString* s=@"11";
int i=[s intValue];  // i now contains 11

Кроме того, спецификация % в NSLog не , а определяет, как вы хотите, чтобы объект интерпретировался. Вам необходимо указать правильную % вещь, соответствующую типу объекта. В противном случае это просто показывает мусор. Итак, оба

NSLog(@"the current font Value1 is %i", val);
NSLog(@"the current font Value2 is %i",val2);

являются незаконными, потому что val и val2 являются NSString*. Вместо этого вам нужно сделать

NSLog(@"the current font Value1 is %@", val);
NSLog(@"the current font Value2 is %@",val2);

или

NSLog(@"the current font Value1 is %i", [val intValue]);
NSLog(@"the current font Value2 is %i",[val2 intValue]);

Вы также не можете сравнивать два NSString* с ==. Вам нужно использовать [aString isEqualTo:anotherString].

1 голос
/ 18 ноября 2010

Я согласен с @Yuji, в цели C вы не должны пытаться сравнивать строки с целыми числами. Скорее всего, вы в конечном итоге встретите дикий номер в системном буфере. Или, если у вас есть метод отладки, вы, скорее всего, получите out of range exception.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...