Ho appena messo insieme un rapido esempio di come mi avvicinerei a questo, ma si scopre che è più, strano, di quanto inizialmente ti aspetti. Per uno, NSCharacterSet
non implementa l'uguaglianza per controllare il contenuto. Usa solo il valore del puntatore. Sulla base di questo tuo esempio NON funzionerà correttamente.
Il mio approccio è utilizzare una NSSet per gestire l'hashing di questi per noi.
@interface StringWrapper : NSObject
@property (nonatomic, copy) NSString *string;
@property (nonatomic, copy) NSData *charSetBitmap;
- (id)initWithString:(NSString*)aString;
@end
@implementation StringWrapper
@synthesize string, charSetBitmap;
- (id)initWithString:(NSString*)aString;
{
if ((self = [super init]))
{
self.string = aString;
}
return self;
}
- (void)setString:(NSString *)aString;
{
string = [aString copy];
self.charSetBitmap = [[NSCharacterSet characterSetWithCharactersInString:aString] bitmapRepresentation];
}
- (BOOL)isEqual:(id)object;
{
return [self.charSetBitmap isEqual:[object charSetBitmap]];
}
- (NSUInteger)hash;
{
return [self.charSetBitmap hash];
}
@end
int main (int argc, const char * argv[])
{
@autoreleasepool {
NSMutableSet *stringWrappers = [[NSMutableSet alloc] init];
NSArray *strings = [NSArray arrayWithObjects:@"abc",@"aaabcccc",@"awea",@"awer",@"abcde", @"ehra", @"QWEQ", @"werawe", nil];
for (NSString *str in strings)
[stringWrappers addObject:[[StringWrapper alloc] initWithString:str]];
NSArray *uniqueStrings = [stringWrappers valueForKey:@"string"];
NSLog(@"%@", uniqueStrings);
}
return 0;
}
Il codice è piuttosto semplice. Creiamo un oggetto contenitore per memorizzare nella cache i risultati della rappresentazione bitmap del set di caratteri. Usiamo la rappresentazione bitmap perché NSData
implementa isEqual:
in modo appropriato.
fonte
2012-01-02 00:29:55
sono "asdf" e "asdfg" univoci in base alle specifiche? –
Sì, quelli sarebbero unici. – Rob