¿Cómo ver si un NSString comienza con cierta otra cadena?

152

Estoy tratando de verificar si una cadena que voy a usar como URL comienza con http. La forma en que estoy tratando de verificar en este momento no parece estar funcionando. Aquí está mi código:

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

¿Algunas ideas?

Robar
fuente

Respuestas:

331

Prueba esto: if ([myString hasPrefix:@"http"]).

Por cierto, su prueba debe ser en != NSNotFoundlugar de == NSNotFound. Pero supongamos que su URL es ftp://my_http_host.com/thing, coincidirá pero no debería.

Cirilo
fuente
Sí, eso fue todo. Debería haber notado la cosa! = Antes, pero al final fue el hasPrefix lo que funcionó. Gracias por el consejo, marcaré la suya como la respuesta correcta tan pronto como me lo permita.
Rob
23

Me gusta usar este método:

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

o incluso más fácil:

if ([temp hasPrefix:@"http"]) {
    //do your stuff
}
JonasG
fuente
1
Eso también es bueno. De esta manera también es un poco más flexible, gracias por el comentario
Rob
2
Esto se bloqueará si la cadena temporal tiene menos de 5 caracteres. El índice comienza en 0. Entonces, esta no es una buena respuesta. Además, el ejemplo tiene una falta de coincidencia de recuento de caracteres: "http" no tiene 5 caracteres. La insensibilidad a los casos también debe ser considerada.
Daniel
@Daniel ¿Qué estás diciendo? ¿Por qué 5? Esto no es un NSArray ... ¡El índice 4 es el 4to carácter, no el 5to! ¿Y alguna vez has visto Http o hTtP? Las mayúsculas y minúsculas no son relevantes. Además, la pregunta era sobre verificar si la cadena comienza con http, no sobre si la cadena tiene menos de 4 caracteres. hasPrefix: es mejor pero funciona igual de bien. Deja de
quejarte
3
@JonasG: Sí, tiene razón sobre el comportamiento de substringToIndex. Sin embargo, tenga en cuenta que el índice 4 es en realidad el quinto carácter; El índice 0 es el primer carácter. Asumí por error que substringToIndex incluye el carácter especificado por el índice, pero no lo hace. La distinción entre mayúsculas y minúsculas es relevante cuando la participación del usuario está involucrada, lo que creo que la pregunta sugiere. Considere el caso de " HTTP: // WWW ...". Pero el mayor problema es que la solución propuesta arrojará una excepción cuando encuentre "ftp" o una cadena de menos de 4 caracteres. El método hasPrefix no tiene el mismo problema.
Daniel
6

Si está buscando "http:" probablemente querrá una búsqueda sin distinción entre mayúsculas y minúsculas:

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

Versión rápida:

if line.hasPrefix("#") {
  // checks to see if a string (line) begins with the character "#"
}
Ricardo
fuente
No sé por qué esto fue rechazado ... esta es la forma simple y rápida de hacer esto. La mayoría de los nuevos desarrolladores de iOS probablemente usarán Swift de ahora en adelante, y el OP nunca dijo que solo se solicitaran respuestas Objective-C.
Richard
"No sé por qué esto fue rechazado", ¿probablemente porque la sintaxis es incorrecta? Debería ser if line.hasPrefix("prefix"){} `
superarts.org
1
Gracias por señalar una sintaxis más simple, pero colocar () alrededor de una declaración if no es una sintaxis incorrecta. Para algunos de los veteranos, se lee más claramente y funciona exactamente igual. if (line.hasPrefix("#")) {}funciona igual de bien
Richard
-1

Esta es mi solución al problema. Eliminará las letras que no son necesarias y no distingue entre mayúsculas y minúsculas.

    - (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
fuente