Objective-C'de dize karşılaştırması


93

Şu anda iPhone uygulamamla SOAP üzerinden iletişim kurduğum bir web sunucusu kurulumum var. Bir GUID içeren bir dize döndürüyorum ve bunu başka bir dizeyle karşılaştırmaya çalıştığımda bazı garip sonuçlar alıyorum.

Bu neden ateşlenmesin? Elbette iki dizge uyuyor mu?

NSString *myString = @"hello world";

if(myString == @"hello world")
    return;

1
Bu soru artık çoğunlukla işe yaramaz çünkü ekran görüntüsü kayboldu. Kodun sorulara kopyalanıp yapıştırılmasının nedeni budur.
jscs

Ekran görüntüsü sanırım hataydı ama cevap 2 yıl önce verildi!
ingh.am

1
Ancak gelecekteki hiçbir okuyucu, hatayı veya kullandığınız kodu, onlarınkiyle aynı olup olmadığını bilmek için göremez, bu da bu sorunun başka kimseye yardımcı olamayacağı anlamına gelir.
jscs

Görüntüyü arayacağım. Bunun diğer sorular için bir referans üssü olduğunu anlıyorum, ancak şimdi kapatmak biraz anlamsız.
ingh.am

2
Bu soru neden kapandı? Bu tamamen geçerli bir soru!
ibz

Yanıtlar:


218

-isEqualToString:İki dizenin değerini karşılaştırmak için yöntemi kullanın . C ==operatörünü kullanmak basitçe nesnelerin adreslerini karşılaştıracaktır.

if ([category isEqualToString:@"Some String"])
{
    // Do stuff...
}

2
AH! Çok teşekkür ederim. Bu sefer biraz aptal gibi hissedin!
ingh.am

3
Tahminimce, ObjectiveC ++ 'da size == kullanabilmeniz için sözdizimsel olarak şekerli bir yetenek sağlamak için bir operatör aşırı yüklemesi yaratabilirsiniz, ancak hiçbir mantıklı hedef C programcısı bunu yapmaz, çünkü == yalnızca hedef C nesnelerinde kimlik kontrolleri için kullanılır.
Warren P

48

Neye ihtiyacınız olduğuna bağlı olarak, büyük / küçük harfe duyarlı veya büyük / küçük harfe duyarlı olmayan karşılaştırmayı kullanabilirsiniz. Büyük / küçük harfe duyarlı şu şekildedir:

if ([category isEqualToString:@"Some String"])
{
   // Both strings are equal without respect to their case.
}

Büyük / küçük harfe duyarlı değildir:

if ([category compare:@"Some String" options:NSCaseInsensitiveSearch] == NSOrderedSame)
{
   // Both strings are equal with respect to their case.
}

1
Sanırım şöyle olmalı: ([kategori karşılaştırma: @ "Bazı Dize" seçenekleri: NSCaseInsensitiveSearch] == NSOrderedSame)
JaakL

9
"Karşılaştırma" işlevine dikkat edin, çünkü dize (bu durumda "kategori") nil ise, karşılaştırma her zaman NSOrderedSame döndürür.
nh32rg

Bu harika bir nokta @ nh32rg !! Bunun için +1! İsEqualToString'de de aynı sorun var mı?
badweasel

4

Dizeyi aşağıdaki işlevlerle karşılaştırabilirsiniz.

NSString *first = @"abc";
NSString *second = @"abc";
NSString *third = [[NSString alloc] initWithString:@"abc"];
NSLog(@"%d", (second == third))  
NSLog(@"%d", (first == second)); 
NSLog(@"%d", [first isEqualToString:second]); 
NSLog(@"%d", [first isEqualToString:third]); 

Output will be :-
    0
    1
    1
    1
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.