Bir NSString'in başka bir dize ile başlayıp başlamadığını nasıl görebilirim?


152

Ben URL olarak kullanacağım bir dize http ile başlar olmadığını kontrol etmeye çalışıyorum. Şu anda kontrol etmeye çalıştığım yol çalışmıyor. İşte benim kod:

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

Herhangi bir fikir?

Yanıtlar:


331

Bu deneyin: if ([myString hasPrefix:@"http"]).

Bu arada, testiniz != NSNotFoundyerine olmalıdır == NSNotFound. Ancak URL'nizin ftp://my_http_host.com/thingeşleştiğini, ancak eşleştiğini ancak eşleşmeyeceğini söyleyin .


Evet, buydu. Daha önce! = Şeyi fark etmeliydim, ama sonunda işe yarayan hasPrefix oldu. Tavsiyen için teşekkürler, sizinkine izin verir vermez doğru cevabı işaretleyeceğim.
Rob

23

Bu yöntemi kullanmayı seviyorum:

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

veya daha da kolay:

if ([temp hasPrefix:@"http"]) {
    //do your stuff
}

1
Bu da iyi. Bu şekilde de biraz daha esnek, yorum için teşekkürler
Rob

2
Bu geçici dize 5 karakterden azsa kilitlenir. Endeks 0'da başlıyor. Bu iyi bir cevap değil. Ayrıca, örneğin bir karakter sayısı uyuşmazlığı vardır: "http" 5 karakter içermiyor. Vaka duyarsızlığı da dikkate alınmalıdır.
Daniel

@Daniel Ne diyorsun sen? Neden 5? Bu bir NSArray değil ... Dizin 4, 5. karakter değil 4. karakter! Ve Http veya hTtP'yi hiç gördünüz mü? Büyük / küçük harfe duyarlı değildir. Ayrıca soru, dizenin http ile başlayıp başlamamasının 4 karakterden kısa olmamasıyla ilgili olup olmadığını kontrol etmekti. hasPrefix: iyidir ama bu da işe yarar.
Sızıntıyı

3
@JonasG - Evet, substringToIndex'in davranışı konusunda haklısınız. Bununla birlikte, dizin 4 aslında 5. karakterdir; dizin 0 ilk karakterdir. Yanlışlıkla substringToIndex dizin tarafından belirtilen karakteri içerdiğini varsaymıştı, ama değil. Büyük / küçük harf duyarlılığı, kullanıcı girişi söz konusu olduğunda önemlidir, ki bu sorunun ipucu verdiğine inanıyorum. " HTTP: // WWW ..." durumunu düşünün . Ancak en büyük sorun, önerilen çözümün "ftp" ya da 4 karakterden daha az bir dizeyle karşılaşması durumunda bir istisna atmasıdır. HasPrefix yönteminde aynı sorun yoktur.
Daniel

6

"Http:" için arama yapıyorsanız, büyük / küçük harfe duyarlı olmayan bir arama isteyeceksiniz:

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

2

Hızlı sürüm:

if line.hasPrefix("#") {
  // checks to see if a string (line) begins with the character "#"
}

Bunun neden düşük oy kullanıldığını bilmiyorum ... Bunu yapmanın basit Swift yolu. Çoğu yeni iOS geliştiricisi muhtemelen Swift'i buradan sonra kullanacak ve OP hiçbir zaman yalnızca Objective-C yanıtlarının istendiğini söylemedi.
Richard

"Bunun neden aşağı oy verildiğini bilmiyorum" - muhtemelen sözdizimi yanlış olduğu için mi? if line.hasPrefix("prefix"){} ` Olmalıdır
superarts.org

1
Daha basit bir sözdizimini işaret ettiğiniz için teşekkür ederiz, ancak bir if ifadesinin etrafına () yerleştirmek kötü sözdizimi değildir. Bazı eski zamanlayıcılarımız için, daha net bir şekilde okur ve tamamen aynı şekilde çalışır. if (line.hasPrefix("#")) {}aynı şekilde çalışır.
Richard

-1

Bu benim sorunun çözümü. Gerekli olmayan ve büyük / küçük harfe duyarlı olmayan harfleri kaldıracaktır.

    - (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;
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.