#ios #objective-c #iphone #nsstring #nsmutablestring
#iOS #objective-c #iPhone #nsstring #nsmutablestring
Вопрос:
Я пытаюсь проверить, начинается ли строка, которую я собираюсь использовать в качестве URL, с http. Способ, которым я пытаюсь проверить прямо сейчас, похоже, не работает. Вот мой код:
NSMutableString *temp = [[NSMutableString alloc] initWithString:@"http://"];
if ([businessWebsite rangeOfString:@"http"].location == NSNotFound){
NSString *temp2 = [[NSString alloc] init];
temp2 = businessWebsite;
[temp appendString:temp2];
businessWebsite = temp2;
NSLog(@"Updated BusinessWebsite is: %@", businessWebsite);
}
[web setBusinessWebsiteUrl:businessWebsite];
Есть идеи?
Ответ №1:
Попробуйте это: if ([myString hasPrefix:@"http"])
.
Кстати, ваш тест должен быть != NSNotFound
вместо == NSNotFound
. Но допустим, ваш URL есть ftp://my_http_host.com/thing
, он будет совпадать, но не должен совпадать.
Комментарии:
1. Да, это было так. Я должен был заметить != вещь раньше, но в конце концов сработал hasPrefix . Спасибо за совет, я отмечу ваш как правильный ответ, как только он мне позволит.
Ответ №2:
Мне нравится использовать этот метод:
if ([[temp substringToIndex:4] isEqualToString:@"http"]) {
//starts with http
}
или еще проще:
if ([temp hasPrefix:@"http"]) {
//do your stuff
}
Комментарии:
1. Это тоже хорошо. Этот способ также немного более гибкий, спасибо за комментарий
2. Это приведет к сбою, если временная строка меньше 5 символов. Индекс начинается с 0. Так что это не очень хороший ответ. Кроме того, в примере есть несоответствие количества символов: «http» не содержит 5 символов. Также следует учитывать нечувствительность к регистру.
3. @Daniel Что ты вообще говоришь? Почему 5? Это не NSArray… Индекс 4 — это 4-й символ, а не 5-й! И вы КОГДА-НИБУДЬ видели Http или hTtP? Учет регистра не имеет значения. Также вопрос заключался в проверке, начинается ли строка с http, а не о том, что строка короче 4 символов. hasPrefix: лучше, но это работает так же хорошо. Хватит ныть
4. @JonasG — Да, вы правы в отношении поведения substringToIndex . Однако обратите внимание, что индекс 4 на самом деле является 5-м символом; индекс 0 — это первый символ. Я ошибочно предположил, что substringToIndex включает символ, указанный индексом, но это не так. Чувствительность к регистру важна, когда задействован пользовательский ввод, на что, я полагаю, намекает вопрос. Рассмотрим случай » HTTP://WWW …». Но самая большая проблема заключается в том, что предлагаемое решение будет выдавать исключение, когда оно встречает «ftp» или строку длиной менее 4 символов. Метод hasPrefix не имеет такой же проблемы.
Ответ №3:
Если вы проверяете «http:», вам, вероятно, понадобится поиск без учета регистра:
NSRange prefixRange =
[temp rangeOfString:@"http"
options:(NSAnchoredSearch | NSCaseInsensitiveSearch)];
if (prefixRange.location == NSNotFound)
Ответ №4:
Версия Swift:
if line.hasPrefix("#") {
// checks to see if a string (line) begins with the character "#"
}
Комментарии:
1. Я не знаю, почему это было отклонено … это простой быстрый способ сделать это. Большинство новых разработчиков iOS, вероятно, будут использовать Swift с этого момента, и в OP никогда не говорилось, что были запрошены только ответы на Objective-C.
2. «Я не знаю, почему это было отклонено» — возможно, потому, что синтаксис неправильный? Должно быть
if line.hasPrefix("prefix")
{}`3. Спасибо, что указали на более простой синтаксис, но размещение () вокруг оператора if — неплохой синтаксис. Для некоторых из нас, старожилов, он читается более четко и работает точно так же.
if (line.hasPrefix("#")) {}
работает так же хорошо.
Ответ №5:
Это мое решение проблемы. Он удалит ненужные буквы и не учитывает регистр.
- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView {
return [self generateSectionTitles];
}
-(NSArray *)generateSectionTitles {
NSArray *alphaArray = [NSArray arrayWithObjects:@"A", @"B", @"C", @"D", @"E", @"F", @"G", @"H", @"I", @"J", @"K", @"L", @"M", @"N", @"O", @"P", @"Q", @"R", @"S", @"T", @"U", @"V", @"W", @"X", @"Y", @"Z", nil];
NSMutableArray *sectionArray = [[NSMutableArray alloc] init];
for (NSString *character in alphaArray) {
if ([self stringPrefix:character isInArray:self.depNameRows]) {
[sectionArray addObject:character];
}
}
return sectionArray;
}
-(BOOL)stringPrefix:(NSString *)prefix isInArray:(NSArray *)array {
for (NSString *str in array) {
//I needed a case insensitive search so [str hasPrefix:prefix]; would not have worked for me.
NSRange prefixRange = [str rangeOfString:prefix options:(NSAnchoredSearch | NSCaseInsensitiveSearch)];
if (prefixRange.location != NSNotFound) {
return TRUE;
}
}
return FALSE;
}
- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index {
NSInteger newRow = [self indexForFirstChar:title inArray:self.depNameRows];
NSIndexPath *newIndexPath = [NSIndexPath indexPathForRow:newRow inSection:0];
[tableView scrollToRowAtIndexPath:newIndexPath atScrollPosition:UITableViewScrollPositionTop animated:NO];
return index;
}
// Return the index for the location of the first item in an array that begins with a certain character
- (NSInteger)indexForFirstChar:(NSString *)character inArray:(NSArray *)array
{
NSUInteger count = 0;
for (NSString *str in array) {
//I needed a case insensitive search so [str hasPrefix:prefix]; would not have worked for me.
NSRange prefixRange = [str rangeOfString:character options:(NSAnchoredSearch | NSCaseInsensitiveSearch)];
if (prefixRange.location != NSNotFound) {
return count;
}
count ;
}
return 0;
}