NSString: isEqual contre isEqualToString


94

Quelle est la différence entre isEqual:et isEqualToString:?

Pourquoi les classes ajoutent-elles des méthodes isEqualTo * (isEqualToArray pour NSArray, isEqualToData pour NSData, ...) au lieu de simplement remplacer isEqual:?

Réponses:


103

isEqual:compare une chaîne à un objet et retournera NOsi l'objet n'est pas une chaîne. isEqualToString:est plus rapide si vous savez que les deux objets sont des chaînes, comme l' indique la documentation :

Considérations particulières

Lorsque vous savez que les deux objets sont des chaînes, cette méthode est un moyen plus rapide de vérifier l'égalité que isEqual:.

isEqualTo<Class>est utilisé pour fournir des contrôles spécifiques d'égalité. Par exemple; isEqualToArray:vérifie que les tableaux contiennent un nombre égal d'objets et que les objets à un index donné retournent YESpour le isEqual:test.


3
Si vous croyez Aaron Hillegass, alors il n'y a pas de différence de performance, seulement un peu de sécurité de type: blog.bignerdranch.com/334-isequal-vs-isequaltostring
Caro

2
Merci pour le lien - utile. Bien que vous nous demandiez de croire Mark Dalrymple - qui je fais :)
Abizern


16

Aussi, pour écrire vos propres méthodes -isEqual:et -isEqualTo<Class>:, la convention est d'autoriser nil arguments pour -isEqual:et de lever une exception pour les arguments nil à-isEqualTo<Class>:


1
Je n'avais jamais rencontré cela auparavant, aucune documentation à votre connaissance?
Mike Abdullah

2
Cela ne semble pas être vrai pour isEqualToString, qui renvoie simplement NO si vous passez nil.
Jaka Jančar

9
Intéressant, il est documenté dans la section Comparaison d'objets du <a href=" developer.apple.com/documentation/Cocoa/Conceptual/... Fundamentals Guide</a>
Jonathan Dann

Ce n'est pas vrai. isEqualToString ne lève pas d'exception.
respectTheCode

1
La page Web du Cocoa Fundamentals Guide indique: "Ce document ne représente peut-être pas les meilleures pratiques pour le développement actuel." C'est vieux, apparemment.
cbh2000

5

Je suppose que cela fournit une légère amélioration des performances, comme isEqualToString: vous n'aurez pas à taper ce qui est passé.


Votre supposition est probablement vraie :)
Philip007

5

Développer les réponses @Abizern et @Jonathan Dann, les deux isEqualet isEqualToStringtravailler avec des nilvaleurs.

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

Je recommande fortement ce . Les avantages de performance de isEqualToString sont fondamentalement négligeables pour la plupart des applications. Mais il y a deux autres distinctions que l'auteur mentionne:

  • Sécurité de type
  • Le chemin nilest géré

Je ne vois aucune différence dans la manière dont nul est traité par les deux. Soyez nul comme receveur ou argument ou les deux.
SayeedHussain

Tout ce que "ceci" n'existe plus: /
Jared Grubb

1
Merci @JaredGrubb, j'ai trouvé la nouvelle URL.
Ben Packard
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.