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
}
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
}
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];
}
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]];
}
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];
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
è il confronto necessario in quanto [nil IsEqual: uuid2] sarebbe anche tornare NO, giusto? – Joshcodes