#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:
В соответствии с этим
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:
начинается со строчного символа.