Как я могу проверить, имеет ли строка нулевое значение?

#iphone #objective-c #cocoa-touch #nsstring

#iPhone #objective-c #cocoa-touch #nsstring

Вопрос:

извините, но я все еще пытаюсь заставить этот код работать. Это работает, если используется двухзначное число, но происходит сбой при использовании однозначного числа. Как я могу проверить, имеет ли NSString * secDigit значение или равно null. Я надеюсь, что мой вопрос ясен. Заранее спасибо.

 NSString *depositOverTotalRwy = [NSString stringWithFormat:@"%@", [deposit text]];
NSArray *components = [depositOverTotalRwy
                       componentsSeparatedByString:@"/"];
NSString *firstThird = [components objectAtIndex:0];

    char firstChar = [firstThird characterAtIndex:0];
    char secChar = [firstThird characterAtIndex:1];
    NSString *firstDigit = [NSString stringWithFormat:@"%c",firstChar];
NSString *secDigit = [NSString stringWithFormat:@"%c", secChar];

    NSLog(@" i'm %@", firstDigit);
    NSLog(@" i'm %@", secDigit);

if ([firstDigit  isEqualToString: @"1"]) {
    firstDigit=@"wet";
    NSLog(@"wet");
}
if ([firstDigit  isEqualToString: @"2"]) {
    firstDigit=@"wet";
    NSLog(@"snow");

}
if ([firstDigit  isEqualToString: @"3"]) {
    firstDigit=@"wet";
    NSLog(@"ice");
    }

if ([secDigit  isEqualToString: @"1"]) {
    secDigit=@"wet";
    NSLog(@"wet");
}
if ([secDigit  isEqualToString: @"2"]) {
    secDigit=@"snow";

    NSLog(@"snow");
}
if ([secDigit  isEqualToString: @"3"]) {
    secDigit=@"ice";
    NSLog(@"ice");
}
  

спасибо всем вам ….. вот мой код (работает сейчас):

    NSString *depositOverTotalRwy = [NSString stringWithFormat:@"%@", [deposit text]];
NSArray *components = [depositOverTotalRwy
                       componentsSeparatedByString:@"/"];
NSString *firstThird = [components objectAtIndex:0];

    char firstChar = [firstThird characterAtIndex:0];
    NSString *firstDigit = [NSString stringWithFormat:@"%c",firstChar];

    NSLog(@" i'm %@", firstDigit);

if ([firstDigit  isEqualToString: @"1"]) {
    firstDigit=@"wet";
    NSLog(@"wet");
}
if ([firstDigit  isEqualToString: @"2"]) {
    firstDigit=@"wet";
    NSLog(@"snow");

}
if ([firstDigit  isEqualToString: @"3"]) {
    firstDigit=@"wet";
    NSLog(@"ice");
    }
if ([firstThird length] >1) {
    char secChar = [firstThird characterAtIndex:1];
    NSString *secDigit = [NSString stringWithFormat:@"%c", secChar];


if ([secDigit  isEqualToString: @"1"]) {
    secDigit=@"wet";
    NSLog(@"wet");
}
if ([secDigit  isEqualToString: @"2"]) {
    secDigit=@"snow";

    NSLog(@"snow");
}
if ([secDigit  isEqualToString: @"3"]) {
    secDigit=@"ice";
    NSLog(@"ice");
}
}
  

Ответ №1:

Я предполагаю, что ваш код вылетает в этой строке:

 char secChar = [firstThird characterAtIndex:1];
  

Это потому, что вы пытаетесь получить доступ к символу за пределами границ строки. Вам нужно защититься от этого, сначала проверив длину строки:

 if ([firstThird count] > 1) {
    // String has 2 or more characters, do all the stuff that involves
    // a second character.
    char secChar = [firstThird characterAtIndex:1];
    NSString *secDigit = [NSString stringWithFormat:@"%c", secChar];

    if ([secDigit  isEqualToString: @"1"]) {
        secDigit=@"wet";
        NSLog(@"wet");
    }
}
  

Но я бы также хотел порекомендовать не использовать здесь NSString, поскольку у вас уже есть char . Просто сделайте что-то вроде этого:

 if ([firstThird count] > 1) {
    // String has 2 or more characters, do all the stuff that involves
    // a second character.
    char secChar = [firstThird characterAtIndex:1];

    if (secChar == '1') {
        secDigit=@"wet";
        NSLog(@"wet");
    }
}
  

Комментарии:

1. хорошо, но тогда я должен установить метку, подобную этой dep.text = [NSString stringWithFormat:@»1/3 %@ %@», Первая цифра, вторая цифра]; Могу ли я сделать это с помощью символа или мне нужна строка?

2. @mattia: Вы также можете использовать символ: dep.text = [NSString stringWithFormat:@"1/3 %c %c", firstChar, secChar];

Ответ №2:

Я думаю, это то, что вы ищете:

 char secChar;
if(firstThird.length > 1)
{
    secChar = [firstThird characterAtIndex:1];
}
  

Ответ №3:

В соответствии с этим

http://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/Reference/NSString.html

NSString «Вызывает исключение NSRangeException, если индекс находится за пределами конца получателя»

Итак, ваш код:

 char secChar = [firstThird characterAtIndex:1];
  

В чем проблема (вы должны увидеть это в консоли отладчика)

Сначала проверьте длину с помощью

   if ([firstThird length] < 2) {
       // handle the case where it is one digit
  }
  

Ответ №4:

Вы можете проверить количество символов в строке, используя длину NSString. и измените свой код следующим образом

 NSString *depositOverTotalRwy = [NSString stringWithFormat:@"%@", @"23"];
NSArray *components = [depositOverTotalRwy
                       componentsSeparatedByString:@"/"];
NSString *firstThird = [components objectAtIndex:0];


unichar firstChar;
unichar secChar;

if([firstThird length]>1){
    firstChar = [firstThird characterAtIndex:0];
    secChar = [firstThird characterAtIndex:1];
} else {
    firstChar = [firstThird characterAtIndex:0];
    secChar = 0;
}

switch (firstChar) {
    case '1': /* Do your stuff*/break;
    case '2': /* Do your stuff*/break;
    case '3': /* Do your stuff*/break;           
    default:
        break;
}

switch (secChar) {
    case '1': /* Do your stuff*/break;
    case '2': /* Do your stuff*/break;
    case '3': /* Do your stuff*/break;           
    default:
        break;
}
  

вы можете использовать unichar вместо char . И может выполнять проверку в операторах switch.
Если вы используете char , преобразование выполняется из unichar в char, и для некоторых символов вы можете потерять фактическое значение. Таким образом, безопасно использовать unichar…

Если вы хотите преобразовать unichar в string, просто кодируйте NSString * stringChar = [NSString StringWithFormat:@"%C",unicharVariable];

Вот и все…

Комментарии:

1. 1 за то, что заметил, что characterAtIndex: фактически возвращает unichar и привел хороший пример. Незначительный нюанс: stringWithFormat: начинается со строчного символа.