2013-12-11 6 views
5

Qual è il modo migliore (meno codice, più veloce, più affidabile) per confrontare due NSUUIDs?Come confrontare NSUUID

Ecco un esempio:

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

risposta

7

dal riferimento di classe NSUUID:

Nota: La classe NSUUID non è colmato con del CoreFoundation CFUUIDRef numero verde. Utilizzare le stringhe UUID per convertire tra CFUUID e NSUUID, se necessario . Due oggetti NSUUID non possono essere paragonati al valore del puntatore (come CFUUIDRef); utilizzare isEqual: per confrontare due istanze di NSUUID .

Quindi basta usare il seguente:

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

è il confronto necessario in quanto [nil IsEqual: uuid2] sarebbe anche tornare NO, giusto? – Joshcodes

0

Un modo semplice ragionevole per raggiungere questo obiettivo è quello di utilizzare confronto tra stringhe. Tuttavia, un metodo che utilizza il sottostante CFUUIDRef potrebbe essere più veloce.

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

Non è necessario creare un metodo in più per questo, come il documentation afferma che

oggetti NSUUID non sono garantiti per essere confrontabile con il valore del puntatore (come CFUUIDRef); usa isEqual: per confrontare due istanze NSUUID.

Quindi basta fare BOOL sameUUID = [uuid1 isEqual:uuid2];

+0

Sarei interessato al motivo del voto negativo. – tilo

+1

idem. Ti ho votato. –

+0

Lo scopo del "metodo extra" è solo quello di spiegare ulteriormente la domanda. Sarei interessato al motivo di un down-vote anche sulla domanda ;-). – Joshcodes

1

NSUUID avvolge in modo efficace uuid_t.

Soluzione ...

@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