NSString: isEqual vs. isEqualToString


94

Qual'è la differenza tra isEqual:e isEqualToString:?

Perché le classi aggiungono metodi isEqualTo * (isEqualToArray per NSArray, isEqualToData per NSData, ...) invece di limitarsi a sovrascrivere isEqual:?

Risposte:


103

isEqual:confronta una stringa con un oggetto e restituirà NOse l'oggetto non è una stringa. isEqualToString:è più veloce se sai che entrambi gli oggetti sono stringhe, come afferma la documentazione :

considerazioni speciali

Quando sai che entrambi gli oggetti sono stringhe, questo metodo è un modo più veloce per verificare l'uguaglianza rispetto a isEqual:.

isEqualTo<Class>viene utilizzato per fornire controlli specifici per l'uguaglianza. Per esempio; isEqualToArray:verifica che gli array contengano un numero uguale di oggetti e che gli oggetti a un dato indice restituiscano YESper il isEqual:test.


3
Se credi ad Aaron Hillegass, non c'è differenza di prestazioni, solo un po 'di sicurezza: blog.bignerdranch.com/334-isequal-vs-isequaltostring
Caro

2
Grazie per il link - utile. Anche se ci stai chiedendo di credere a Mark Dalrymple - chi faccio io :)
Abizern


16

Inoltre, per scrivere i propri -isEqual:e -isEqualTo<Class>:metodi, la convenzione è di consentire argomenti nulli -isEqual:e sollevare un'eccezione per argomenti nulli-isEqualTo<Class>:


1
Non mi ero mai imbattuto in questo prima, nessuna documentazione che conosci?
Mike Abdullah

2
Questo non sembra essere vero per isEqualToString, che restituisce semplicemente NO se passi a zero.
Jaka Jančar

9
Interessante, è documentato nella sezione Confronto oggetti della <a href=" developer.apple.com/documentation/Cocoa/Conceptual/… Fundamentals Guide</a>
Jonathan Dann

Questo non è vero. isEqualToString non solleva un'eccezione.
RespectTheCode

1
La pagina web Cocoa Fundamentals Guide dice: "Questo documento potrebbe non rappresentare le migliori pratiche per lo sviluppo corrente". È vecchio, a quanto pare.
cbh2000

5

La mia ipotesi è che fornisca un leggero miglioramento delle prestazioni, come èEqualToString: non sarà necessario controllare il tipo di cosa è passato.


La tua ipotesi è probabilmente vera :)
Philip007

5

Espandendo le risposte @Abizern e @Jonathan Dann, entrambi isEquale isEqualToStringlavorare con i nilvalori.

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

Mi raccomando questo . I vantaggi in termini di prestazioni di isEqualToString sono sostanzialmente trascurabili per la maggior parte delle applicazioni. Ma ci sono altre due distinzioni menzionate dall'autore:

  • Tipo di sicurezza
  • Il modo in cui nilè gestito

Non vedo alcuna differenza nel modo in cui i due gestiscono lo zero. Sia zero il destinatario o l'argomento o entrambi.
SayeedHussain

Qualunque cosa sia "questo" non esiste più: /
Jared Grubb

1
Grazie @JaredGrubb, ho trovato il nuovo URL.
Ben Packard
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.