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

Posted

技术标签:

【中文标题】调用类方法并返回目标 c 类别的字典【英文标题】:Call class method and return a dictionary on objective c category 【发布时间】:2013-04-12 07:32:22 【问题描述】:

我在我的 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(或可变)这个创建的排序键和对象数组的字典?基本上在伪代码中我会做类似的事情:

NSMutableArray *englishDictionary = [[NSMutableArray alloc] init]; EnglishDictionary = [NSMutableArray anagramMapScrabble]; //应该是说现在englishDictionary已经变成了NSDictionary,其中key = sorted word,object是那个sorted word的英文字谜数组

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

【问题讨论】:

【参考方案1】:

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

+ (NSDictionary *)anagramMap;

那是 NSObject 的一个类方法,你可以这样调用它:

NSDictionary* d = [NSObject anagramMap];

如果你在 NSObject 上创建一个类别,声明如下:

- (NSDictionary *)anagramMap;

那是 NSObject 的一个方法,你可以这样调用它:

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

【讨论】:

哦,好的。所以我必须调用 NSObject 上的类方法。那是我的问题。谢谢! 不,你没有。您必须在通过类别添加类方法的类上调用类方法。但我不知道那是什么类。你说“我做了一个类别”,但你没有证明这一点。您没有显示任何表明这甚至 类别的代码。而且你没有说你在做了什么类。 我上面的所有代码都属于我在 NSString 的子类上创建的类别 然后将 NSString 替换为我在回答中说 NSObject 的地方!

以上是关于调用类方法并返回目标 c 类别的字典的主要内容,如果未能解决你的问题,请参考以下文章

无法从 CDVPlugin 类目标 c 和 phonegap 调用 MainViewController 的静态方法

获取类变量和值的字典

无法从类字典扩展类

IBOutlet UITextView 在调用另一个类 initWithNibName 并使用方法返回类后为零

类 反射

目标 C:通过自定义根类允许类别中的属性