2010-05-20 16 views
6

Bazen iki NSString işte bu şekilde aynı olup olmadığını test eder kodunu bulmak: ŞimdiNSString karşılaştırması arasında bir fark var: ve isEqual (ToString) :?

if ([str1 compare:str2] == NSOrderedSame) { 
    // Do something 
} 

, bu isEqualToString: kullanmaktan daha az okunabilir olduğuna ve aynı zamanda, bazı kötü yan etkileri vardır str1 == nil eğer gibi (..) doğru olarak değerlendirir veya Apple docs'a göre str2 == nil tahribatı bize zarar verebilir. (Edit: Hatfinch'in işaret ettiği gibi, str1 == nil && str2 == nil her iki değişkenin de yanlış sonuca sahip olması durumunda, bu durumda kendinizi yine de bu duruma karşı korumanız gerekir).

Ancak, şirketimdeki kodlardaki bu ifadelere karşı haçlı seferi öncesinde, önemli bir noktayı kaçırmadığımdan emin olmak istedim.

Bu yüzden sorum, temel olarak aşağıya doğru kaymaktadır: compare: - NSOrderedSame ve isEqual: arasında bir fark var mı? docs Okuma

+0

NB dizge1 ve str2 hem nil ise, [str1 isEqualToString: str2] – hatfinch

+1

Doğru ... ya doğru sonucu döndüren, ancak ile karşılaştırmak değildir: dize olmak nil da sorun değil, . Yani, örneğin [@ "Foo" isEqual: somestring] nil için somestring olmadan. Bu karşılaştırmak ile yapamazsınız: – Alfonso

+1

Tuzaklar, karşılaştırma: ile değil, ancak -compare: 've' isEqual: 'işlevlerinin yan yana karşılaştırılmasında, hataların belirli bir hata sınıfına (BOOL sonucuyla birlikte nil alıcıya) duyarlı olarak vurgulanır.) ikincisine sessiz kalırken yanlış yorumlanabilir. – hatfinch

cevap

12

, ben zaten bahsetmedim fark sadece farklılıklar şunlardır:

  1. isEqualToString: ilk bir uygulamada potansiyel bir hız kazancı iki dizeleri id, karşılaştırır Dizelerin sık tekrar kullanılmasını sağlar.

    Dönüş Değeri: NSString referans itibaren
    EVET aString alıcıya eşdeğerdir if (aynı kimliğe sahip veya onlar bir hazır karşılaştırıldığında NSOrderedSame varsa), aksi takdirde NO. Yukarıdaki alıntıda görüldüğü üzere

  2. isEqualToString:, compare: options:NSLiteralSearch gerçekten daha benzer. NSLiteralSearch Unicode karakter gösterimi hakkında daha titiz olduğunu: string karşılaştırma uygulandığında

    “Değişmez” çeşitli Unicode ayrışma kuralları uygulanmaz ve Unicode karakterleri ayrı ayrı karşılaştırılır anlamına gelir. Yani, örneğin, “O”, “O” karakter dizisi olarak temsil edilir ve umlaut, bir Unicode karakteri olarak gösterilen “Ö” ile eşit değildir.

Bu gerçekten sadece sorunuzu belirtilen yanlış pozitif ve tanımsız davranışı ile karşılaştırıldığında nitpicking.

Kaynak: NSString Class Reference

+0

Ah, NSLiteralSearch hakkında bahsettiğiniz şeylere rastlamadım. Yani, eğer unicode ayrışması önemliyse, karşılaştırmayı kullanmak mantıklı olabilir: – Alfonso

+0

Bu cevap beni kurtardı!Bir Fransızca é almak için hem e + U0301 hem de U00e9 gibi görünen bir dosyadan veri okuyorum. Bu dizeleri HTML'ye koyuyor ve daha sonra bir bağlantıya dokunarak işlem yapmak için asılları karşılaştırıyordum. Bazen karşılaştırmam bir maç bulamıyordu. Şimdi biliyorum çünkü 'isEqualToString' kullanıyordum ve programla oluşturulan href HTML metnim e + U0301'i oluşturulduğu sırada U00e9'a dönüştürmüş olmalı. Bu, aynı dizinin daha uzun eşleştiği anlamına geliyordu! 'Karşılaştır:' seçeneğini kullanarak hiçbir seçeneğim sorunumu çözdü. Çok teşekkürler. –

+0

Benzer şekilde, iTunes, şarkı meta verisinde oluşturulmuş karakter dizileri kullanır; bu nedenle, müzik kitaplığındaki aksan işaretlerini içeren bir şarkı başlığı bulmaya çalışıyorsanız, "karşılaştırın" çalışır, ancak "isEqualToString" bunu yapmaz. – arlomedia

İlgili konular