Wie kann man sehen, ob ein NSString mit einer bestimmten anderen Zeichenfolge beginnt?

152

Ich versuche zu überprüfen, ob eine Zeichenfolge, die ich als URL verwenden werde, mit http beginnt. Die Art und Weise, wie ich gerade versuche zu überprüfen, scheint nicht zu funktionieren. Hier ist mein Code:

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];

Irgendwelche Ideen?

rauben
quelle

Antworten:

331

Versuchen Sie Folgendes : if ([myString hasPrefix:@"http"]).

Übrigens sollte Ihr Test != NSNotFoundstatt sein == NSNotFound. Angenommen, Ihre URL ftp://my_http_host.com/thingstimmt, sollte aber nicht übereinstimmen.

Cyrille
quelle
Ja das war es. Ich hätte das! = Ding schon früher bemerken sollen, aber am Ende hat das hasPrefix funktioniert. Vielen Dank für den Rat, ich werde Ihre als die richtige Antwort markieren, sobald es mir erlaubt.
Rob
23

Ich benutze diese Methode gerne:

if ([[temp substringToIndex:4] isEqualToString:@"http"]) {
  //starts with http
}

oder noch einfacher:

if ([temp hasPrefix:@"http"]) {
    //do your stuff
}
JonasG
quelle
1
Das ist auch gut. Dieser Weg ist auch etwas flexibler, danke für den Kommentar
Rob
2
Dies stürzt ab, wenn die temporäre Zeichenfolge weniger als 5 Zeichen umfasst. Der Index beginnt bei 0. Dies ist also keine gute Antwort. Das Beispiel weist auch eine Nichtübereinstimmung der Zeichenanzahl auf: "http" enthält keine 5 Zeichen. Groß- und Kleinschreibung sollte ebenfalls berücksichtigt werden.
Daniel
@ Daniel Was sagst du überhaupt? Warum 5? Dies ist kein NSArray ... Index 4 ist das 4. Zeichen, nicht das 5! Und hast du jemals HTTP oder HTTP gesehen? Groß- und Kleinschreibung ist nicht relevant. Außerdem ging es darum zu prüfen, ob die Zeichenfolge mit http beginnt und nicht, ob die Zeichenfolge kürzer als 4 Zeichen ist. hasPrefix: ist besser, aber das funktioniert genauso gut. Hör auf zu jammern
JonasG
3
@JonasG - Ja, Sie haben Recht mit dem Verhalten von substringToIndex. Beachten Sie jedoch, dass Index 4 tatsächlich das 5. Zeichen ist. Index 0 ist das erste Zeichen. Ich hatte fälschlicherweise angenommen, dass substringToIndex das vom Index angegebene Zeichen enthält, dies jedoch nicht. Die Groß- und Kleinschreibung ist relevant, wenn Benutzereingaben erforderlich sind, auf die die Frage meines Erachtens hinweist. Betrachten Sie den Fall von " HTTP: // WWW ...". Das größte Problem ist jedoch, dass die vorgeschlagene Lösung eine Ausnahme auslöst, wenn "ftp" oder eine Zeichenfolge mit weniger als 4 Zeichen auftritt. Die hasPrefix-Methode hat nicht das gleiche Problem.
Daniel
6

Wenn Sie nach "http:" suchen, möchten Sie wahrscheinlich die Suche ohne Berücksichtigung der Groß- und Kleinschreibung:

NSRange prefixRange = 
    [temp rangeOfString:@"http" 
                options:(NSAnchoredSearch | NSCaseInsensitiveSearch)];
if (prefixRange.location == NSNotFound)
Bobics
quelle
2

Schnelle Version:

if line.hasPrefix("#") {
  // checks to see if a string (line) begins with the character "#"
}
Richard
quelle
Ich weiß nicht, warum dies abgelehnt wurde ... dies ist die einfache schnelle Methode, dies zu tun. Die meisten neuen iOS-Entwickler werden wahrscheinlich von nun an Swift verwenden, und das OP hat nie gesagt, dass nur Objective-C-Antworten angefordert wurden.
Richard
"Ich weiß nicht, warum dies abgelehnt wurde" - wahrscheinlich, weil die Syntax falsch ist? Sollte if line.hasPrefix("prefix"){} `
superarts.org
1
Vielen Dank, dass Sie auf eine einfachere Syntax hingewiesen haben, aber das Platzieren () um eine if-Anweisung ist keine schlechte Syntax. Für einige von uns Oldtimern liest es sich klarer und funktioniert genauso. if (line.hasPrefix("#")) {}funktioniert genauso gut.
Richard
-1

Dies ist meine Lösung für das Problem. Es werden die Buchstaben entfernt, die nicht erforderlich sind, und die Groß- und Kleinschreibung wird nicht berücksichtigt.

    - (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;
}
Hackmodford
quelle