Iphone 什么';存储许多词典的最佳方式是什么?

Iphone 什么';存储许多词典的最佳方式是什么?,iphone,objective-c,nsstring,nsarray,nsdictionary,Iphone,Objective C,Nsstring,Nsarray,Nsdictionary,我需要在iPhone应用程序中为不同的配置和设置存储许多Facebook应用程序Id和Twitter用户密钥 我知道我这样做的方式不是最好的,因为它有太多的if-else语句。使用正确的Objective-C设计模式完成此任务的最佳方式是什么? 这是我的密码: - (id) init { self = [super init]; if (!self) return nil; keyNames = [[NSArray arrayWithObjects: @"facebo

我需要在iPhone应用程序中为不同的配置和设置存储许多Facebook应用程序IdTwitter用户密钥

我知道我这样做的方式不是最好的,因为它有太多的
if-else
语句。使用正确的Objective-C设计模式完成此任务的最佳方式是什么?

这是我的密码:

- (id) init {
self = [super init];
if (!self) return nil;

keyNames = [[NSArray arrayWithObjects:
             @"facebookAppId", 
             @"facebookLocalAppId",
             @"twitterConsumerKey",
             @"twitterSecret",
             nil]retain];

if (MainLanguage == @"English") {

    keys = [[NSArray arrayWithObjects:
             @"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", //facebookAppId
             @"yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy", //facebookLocalAppId
             @"zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz", //twitterConsumerKey
             @"wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww", //twitterSecret
             nil]retain];

    dictionary = [[NSDictionary dictionaryWithObjects:keys forKeys:keyNames]retain];

}

else if (MainLanguage == @"Spanish") {

    keys = [[NSArray arrayWithObjects:
             @"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", //facebookAppId
             @"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", //facebookLocalAppId
             @"cccccccccccccccccccccccccccccccc", //twitterConsumerKey
             @"dddddddddddddddddddddddddddddddd", //twitterSecret
             nil]retain];

    dictionary = [[NSDictionary dictionaryWithObjects:keys forKeys:keyNames]retain];

}  else if (MainLanguage == @"French") {

   //etc...

} else if (MainLanguage == @"Italian") {

    //etc...

}


//etc..

return self;
}


数据必须存储在某个地方,对吗?您可以有一个单独的类将数据存储在哈希表中。然后,你只需要在每次获得一种语言时引用它。你的代码看起来肯定会更干净。查看NSHashTable。

两个主要问题:

  • 为什么键名在数组中
  • 您不应该将NSString*s与==进行比较
您可能还想使用语言代码

我可以想到两个“目标C”选项,一个是黑客选项,一个是“C”选项:

  • 把它存到字典里。这似乎有点浪费,因为它构造了一堆字典,并且只使用其中一个

    [NSDictionary dictionaryWithObjectsAndKeys:
      [NSDictionary dictionaryWithObjectsAndKeys:
        @"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", @"facebookAppId",
        @"yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy", @"facebookLocalAppId",
        ...
      nil], @"en",
      [NSDictionary dictionaryWithObjectsAndKeys:
        @"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", @"facebookAppId",
        ...
      nil], @"es",
      ...
    nil]
    
  • 把它放进词典里。这可能会有问题,因为提取它们所需要做的就是解压缩你的.ipa

    <dict>
      <key>en</key>
      <dict>
        <key>facebookAppId</key>
        <string>...</string>
        ...
      </dict>
      <key>es</key>
      <dict>
        ...
      </dict>
      ...
    </dict>
    
    
    EN
    facebookAppId
    ...
    ...
    锿
    ...
    ...
    
  • 将其存储在Localizable.strings中。同样,通过解压.ipa可以提取一些琐碎的内容

  • 将其存储在结构数组中:

    struct {
      NSString *lang;
      NSString *facebookAppId;
      NSString *facebookLocalAppId;
      NSString *twitterConsumerKey;
      NSString *twitterConsumerSecret;
    } const foo_data[] = {
      {@"en", @"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", @"yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy", ...},
      {@"es", @"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", ...},
      ...
    };
    
    ...
    
    for (size_t i = 0; i < sizeof(foo_data)/sizeof(foo_data[0]); i++) {
      if ([lang isEqualToString:foo_data[i].lang]) {
        return [NSDictionary dictionaryWithObjectsAndKeys:
                 foo_data[i].facebookAppId,@"facebookAppId",
                 ...
               nil];
      }
    }
    
    struct{
    NSString*lang;
    NSString*facebookAppId;
    NSString*facebookLocalAppId;
    NSString*twitterConsumerKey;
    NSString*TwitterConsumerCret;
    }常量foo_数据[]={
    {“en”、@“xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx”、@“yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy,
    {@“es”、@“aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,
    ...
    };
    ...
    对于(size_t i=0;i

  • 谢谢,我来看看。我想用plist文件,但在这种情况下不安全。NSHashTable是否适用于iPhone?假设每种语言的值不同,那么实际上您并没有做错。如果您想知道如何存储数据,我可以发布一个关于创建自定义可架构对象的示例!谢谢!
    struct {
      NSString *lang;
      NSString *facebookAppId;
      NSString *facebookLocalAppId;
      NSString *twitterConsumerKey;
      NSString *twitterConsumerSecret;
    } const foo_data[] = {
      {@"en", @"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", @"yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy", ...},
      {@"es", @"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", ...},
      ...
    };
    
    ...
    
    for (size_t i = 0; i < sizeof(foo_data)/sizeof(foo_data[0]); i++) {
      if ([lang isEqualToString:foo_data[i].lang]) {
        return [NSDictionary dictionaryWithObjectsAndKeys:
                 foo_data[i].facebookAppId,@"facebookAppId",
                 ...
               nil];
      }
    }