NSString: isEqual ve isEqualToString


94

Arasındaki fark nedir isEqual:ve isEqualToString:?

Sınıflar neden geçersiz kılmak yerine isEqualTo * yöntemlerini (NSArray için isEqualToArray, NSData için isEqualToData, ...) ekliyor isEqual:?

Yanıtlar:


103

isEqual:bir dizeyi bir nesneyle karşılaştırır NOve nesne bir dizge değilse geri döner . belgelerde belirtildiği isEqualToString:gibi, her iki nesnenin de dize olduğunu biliyorsanız daha hızlıdır :

Özel Hususlar

Her iki nesnenin de dize olduğunu bildiğinizde, bu yöntem eşitliği kontrol etmenin daha hızlı bir yoludur isEqual:.

isEqualTo<Class>eşitlik için belirli kontroller sağlamak için kullanılır. Örneğin; isEqualToArray:dizilerin eşit sayıda nesne içerdiğini ve belirli bir dizindeki nesnelerin test YESiçin geri döndüğünü kontrol eder isEqual:.


3
Aaron Hillegass'a inanıyorsanız, performans farkı yoktur, sadece biraz güvenlik türü: blog.bignerdranch.com/334-isequal-vs-isequaltostring
Caro

2
Bağlantı için teşekkürler - kullanışlı. Bizden Mark Dalrymple'a inanmamızı istemenize rağmen - kimi yaparım :)
Abizern


16

Ayrıca, kendi yöntemlerinizi -isEqual:ve -isEqualTo<Class>:yöntemlerinizi yazmak için , kural nil argümanlara izin vermek ve nil argümanlar için -isEqual:bir istisna oluşturmaktır.-isEqualTo<Class>:


1
Buna daha önce rastlamadım, bildiğiniz herhangi bir belge?
Mike Abdullah

2
Bu, isEqualToString için doğru görünmüyor, bu sadece sıfıra geçerseniz NO döndürür.
Jaka Jančar

9
İlginçtir, <a href=" developer.apple.com/documentation/Cocoa/Conceptual/… Temel Bilgiler Kılavuzu</a> ' nın Nesne Karşılaştırma bölümünde belgelenmiştir
Jonathan Dann

Bu doğru değil. isEqualToString bir istisna oluşturmaz.
saygıTheCode

1
Kakao Temelleri Kılavuzu web sayfasında "Bu belge mevcut geliştirme için en iyi uygulamaları temsil etmeyebilir" diyor. Görünüşe göre eski.
cbh2000

5

Benim tahminim o isEqualToString olarak, hafif bir performans geliştirmesi sağlar şudur: tip-onay için geçirilen neler olmayacaktır.



5

@Abizern ve @Jonathan Dann yanıtlara genişletilmesi, hem isEqualve isEqualToStringbirlikte çalışma nildeğerlerinin.

- (void)testStringEqual {
    NSString *string = nil;

    STAssertFalse([string isEqual:@"test"], @"NSString isEqual");
    STAssertFalse([string isEqualToString:@"test"], @"NSString isEqualToString");

    // Note that these both return NO
    STAssertFalse([string isEqual:nil], @"NSString isEqual");
    STAssertFalse([string isEqualToString:nil], @"NSString isEqualToString");

    string = @"test";

    STAssertTrue([string isEqual:@"test"], @"NSString isEqual");
    STAssertTrue([string isEqualToString:@"test"], @"NSString isEqualToString");

    STAssertFalse([string isEqual:nil], @"NSString isEqual");
    STAssertFalse([string isEqualToString:nil], @"NSString isEqualToString");
}

4

Ben çok tavsiye bu . İsEqualToString'in performans avantajları temelde çoğu uygulama için ihmal edilebilir düzeydedir. Ancak yazarın bahsettiği iki fark daha var:

  • Tip güvenliği
  • Yol nilhalledilir

İkisinin nil'i ele alma biçiminde bir fark görmüyorum. Alıcı veya argüman veya her ikisi de sıfır olun.
SayeedHussain

"Bu" ne olursa olsun artık yok: /
Jared Grubb

1
Teşekkürler @JaredGrubb, yeni URL'yi buldum.
Ben Packard
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.