2013-12-11 8 views
5

Was ist die beste (am wenigsten Code, schnellste, zuverlässigste) Möglichkeit, zwei NSUUIDs zu vergleichen? HierWie zu vergleichen NSUUID

ein Beispiel:

-(BOOL)isUUID:(NSUUID*)uuid1 equalToUUID:(NSUUID*)uuid2 
{ 
    return ... // YES if same or NO if not same 
} 

Antwort

7

Vom NSUUID Klassenreferenz:

Hinweis: Die NSUUID Klasse ist nicht gebührenfrei mit CFUUIDRef der Corefoundation überbrückt. Verwenden Sie UUID-Zeichenfolgen, um zwischen CFUUID und NSUUID zu konvertieren, wenn benötigt wird. Zwei NSUUID-Objekte sind nicht garantiert vergleichbar durch Zeigerwert (wie CFUUIDRef ist); Verwenden Sie isEqual: um zwei NSUUID Instanzen zu vergleichen.

So benutzen Sie einfach die folgenden Schritte aus:

-(BOOL)isUUID:(NSUUID*)uuid1 equalToUUID:(NSUUID*)uuid2 
{ 
    return [uuid1 isEqual:uuid2]; 
} 
+2

Ist der Vergleich notwendig, da [nil isEqual: uuid2] auch nein, richtig zurückkommen würde? – Joshcodes

0

Eine vernünftige einfache Möglichkeit, dies zu erreichen, ist String-Vergleich zu verwenden. Eine Methode, die die zugrundeliegende CFUUIDRef verwendet, kann jedoch schneller sein.

-(BOOL)isUUID:(NSUUID*)uuid1 equalToUUID:(NSUUID*)uuid2 
{ 
    return [[uuid1 UUIDString] isEqualToString:[uuid2 UUIDString]]; 
} 
7

Sie benötigen keine zusätzliche Methode dafür zu schaffen, wie die documentation besagt, dass

NSUUID Objekte werden nicht garantiert vergleichbar durch Zeigerwert (wie CFUUIDRef ist); Verwenden Sie isEqual: um zwei NSUUID-Instanzen zu vergleichen.

So tun nur BOOL sameUUID = [uuid1 isEqual:uuid2];

+0

Ich würde mich für den Grund für eine Down-Abstimmung interessieren. – tilo

+1

Dito. Ich habe dich gewählt. –

+0

Der Zweck der "zusätzlichen Methode" ist nur, um die Frage weiter zu erklären. Ich wäre auch an dem Grund interessiert, die Frage zu verwerfen. – Joshcodes

1

NSUUID effektiv wickelt uuid_t.

Lösung ...

@implementation NSUUID (Compare) 



- (NSComparisonResult) compare : (NSUUID *) that 
{ 
    uuid_t x; 
    uuid_t y; 

    [ self getUUIDBytes : x ]; 
    [ that getUUIDBytes : y ]; 

    const int r = memcmp (x, y, sizeof (x)); 

    if (r < 0) 
     return NSOrderedAscending; 
    if (r > 0) 
     return NSOrderedDescending; 

    return NSOrderedSame; 
} 



@end