web-dev-qa-db-fra.com

NSString: isEqual vs isEqualToString

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:?

93
Jaka Jančar

isEqual: compare une chaîne à un objet et renverra NO si 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 documentation :

Considérations spéciales

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 vérifications spécifiques de l'égalité. Par exemple; isEqualToArray: vérifie que les tableaux contiennent un nombre égal d'objets et que les objets d'un index donné renvoient YES pour le isEqual: test.

102
Abizern

Aussi, pour écrire votre propre -isEqual: et -isEqualTo<Class>: méthodes, la convention consiste à autoriser des arguments nuls pour -isEqual: et lève une exception pour les arguments nuls à -isEqualTo<Class>:

16
Jonathan Dann

Mon devinez est qu'il fournit une légère amélioration des performances, comme isEqualToString: n'aura pas à vérifier par type ce qui est passé.

5
iKenndac

En développant les réponses @Abizern et @Jonathan Dann, isEqual et isEqualToString fonctionnent avec les valeurs nil.

- (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");
}
5
respectTheCode

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

  • Type de sécurité
  • La façon dont nil est gérée
4
Ben Packard