调用类方法并返回目标c类别的字典

时间:2013-04-19 01:03:03

标签: objective-c class methods nsdictionary anagram

我在x-code项目中创建了一个类别,如下所示:

+ (NSDictionary *)anagramMap {
static NSDictionary *anagramMap;
if (anagramMap != nil)
    return anagramMap;

// this file is present on Mac OS and other unix variants
NSString *allWords = [NSString stringWithContentsOfFile:@"/usr/share/dict/words"
                                               encoding:NSUTF8StringEncoding
                                                  error:NULL];




NSMutableDictionary *map = [NSMutableDictionary dictionary];
@autoreleasepool {
    [allWords enumerateLinesUsingBlock:^(NSString *word, BOOL *stop) {
        NSString *key = [word anagramKey];
        if (key == nil)
            return;
        NSMutableArray *keyWords = [map objectForKey:key];
        if (keyWords == nil) {
            keyWords = [NSMutableArray array];
            [map setObject:keyWords forKey:key];
        }
        [keyWords addObject:word];
    }];
}

anagramMap = map;
return anagramMap;}


  - (NSString *)anagramKey {
NSString *lowercaseWord = [self lowercaseString];

// make sure to take the length *after* lowercase. it might change!
NSUInteger length = [lowercaseWord length];

unichar sortedWord[length];
[lowercaseWord getCharacters:sortedWord range:(NSRange){0, length}];

qsort_b(sortedWord, length, sizeof(unichar), ^int(const void *a, const void *b) {
    unichar c1 = *(const unichar *)a;
    unichar c2 = *(const unichar *)b;
    if (c1 > c2)
        return -1;
    if (c1 < c2)
        return 1;
    return 0;
});

return [NSString stringWithCharacters:sortedWord length:length];}

基本上,这段代码循环通过Mac OSx字典并将其转换为NSDictionary,其中键是按字母顺序排序的单词,对象是该单词的所有字符串的数组。

我想知道的是,我如何调用此方法,例如在实现文件的viewDidLoad部分中,该文件将分配NSDictionary(或可变)这个已创建的排序键和对象数组的字典?基本上在伪代码中我做了类似的事情:

NSMutatableArray * englishDictionary = [[NSMutableArray alloc] init];    englishDictionary = [NSMutableArray anagramMapScrabble]; //应该意味着现在englishDictionary已经变成了NSDictionary,其中key = sorted word和object是一个排序单词的英文字符数组

我想我必须在方法中添加一些额外的代码,但我不确定。任何建议将不胜感激!

1 个答案:

答案 0 :(得分:1)

类别是对现有类的修改。它的工作方式与在该类中声明类别的方法完全相同 - 因为它们是。所以它像其他方法一样工作。如果你创建一个类别,比如,NSObject声明如下:

+ (NSDictionary *)anagramMap;

然后,这是NSObject的类方法,你可以这样说:

NSDictionary* d = [NSObject anagramMap];

如果你在NSObject上做了一个类别声明如下:

- (NSDictionary *)anagramMap;

那么这是NSObject的一种方法,你可以这样说:

NSObject* o = [NSObject new];
NSDictionary* d = [o anagramMap];