Objective-C enum-map

时间:2011-12-19 19:01:02

标签: objective-c json

我目前是Java程序员和学习目标C.为了创建JSON对象,我想将以下Java-Pseudocode转换为目标C.然而,由于看起来我想要的所有内容在目标C中不可用,因此我遇到了很多巨大的问题。我自己的变体占用了更多的空间并且更复杂,但是我只是一个初学者,我想知道是否有更简单和简短的方法来实现它。

Java代码

import java.util.HashMap;
import java.util.Map;

public class Parameters
{
    public enum Language {deDE};
    protected Language language = null;
    // ... other parameters ...
    protected static final Map<Language,String> languageToString = new HashMap<>();
    static {languageToString.put(Language.deDE,"de-DE");}

    Map<String,String> jsonProxy()
    {
        HashMap<String, String> map = new HashMap<>();
        if(language!=null) {map.put("lang", languageToString.get(language));}
           return map;
    }
}

我的Objective-C尝试

@interface Parameters : NSObject

    enum Lang {deDE};

    extern NSMutableDictionary *langToString;

    - (id) proxyForJson;
extern int test;
@end

@implementation Parameters

enum Lang* lang = nil;
NSMutableDictionary *langToString;

-(CommunicationParameters*) init
{
self = [super init];
return self;
}  
+(void) initialize
{
langToString = [[NSMutableDictionary alloc] init];
[langToString   setObject:@"de-DE"    forKey:[NSNumber numberWithInt:deDE]];
}

-(id) proxyForJson
{
NSMutableDictionary* dictionary = [[NSMutableDictionary alloc] init];
if(lang!=nil)
{
[dictionary setObject:[langToString objectForKey:[NSNumber numberWithInt:*lang]] forKey:@"lang"];
}
// does this work? is a mutable dictionary a subclass of dictionary?
return dictionary;
}        

1 个答案:

答案 0 :(得分:1)

看起来有点像你试图逐行翻译Java代码,除了令人头疼之外不会导致任何问题。我想指出的一些事情:

  1. Initialiser方法应始终返回类型id(不是超类)。
  2. 除了返回self之外什么都不做的初始化方法不需要实现,这是因为如果没有为类提供init方法,它将直接调用超类{{1} 1}}方法。
  3. init方法的内存管理错误。您将通过一个方法返回您拥有的对象,该方法的名称不包含返回值的所有权。而是使用proxyForJson创建字典,因为此方法的结果没有所有者。
  4. 您的类使用可能不应该是全局变量的全局变量。我不完全确定,但我认为最好让[NSMutableDictionary dictionary]为您的类的实例变量,该变量是通过lang方法的参数设置的,例如init。当然,这将更接近您的Java实现。
  5. 由于枚举是顺序的并且从0开始(除非另有说明),您可以完全避免使用地图并使用initWithLanguageID:个对象的简单静态数组,每个NSString的一个条目对应一个枚举。更好的是,不要使用枚举并允许调用者将语言指定为字符串。从我所看到的,枚举似乎没有任何其他用途,只是将整数映射到字符串。