0

我需要为我的 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;

}

-(void)dealloc {

    [keyNames release];
    [keys release];
    [dictionary release];
    [super dealloc];

}
4

2 回答 2

1

两个主要问题:

  • 为什么键名在数组中?
  • 您不应该将 NSString*s 与 == 进行比较。

您可能还想使用语言代码。

我可以想到两个“Objective-C”选项,一个 hacky 选项和一个“C”选项:

  1. 将其存储在字典中。这似乎有点浪费,因为它构建了一堆字典并且只使用其中一个。

    [NSDictionary dictionaryWithObjectsAndKeys:
      [NSDictionary dictionaryWithObjectsAndKeys:
        @"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", @"facebookAppId",
        @"yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy", @"facebookLocalAppId",
        ...
      nil], @"en",
      [NSDictionary dictionaryWithObjectsAndKeys:
        @"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", @"facebookAppId",
        ...
      nil], @"es",
      ...
    nil]
    
  2. 将其粘贴在 plist 中。这可能是有问题的,因为提取它们所要做的就是解压缩您的 .ipa。

    <dict>
      <key>en</key>
      <dict>
        <key>facebookAppId</key>
        <string>...</string>
        ...
      </dict>
      <key>es</key>
      <dict>
        ...
      </dict>
      ...
    </dict>
    
  3. 将其存储在 Localizable.strings 中。同样,通过解压缩 .ipa 来提取也很简单。

  4. 将其存储在结构数组中:

    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];
      }
    }
    
于 2012-07-21T02:23:52.727 回答
0

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

于 2012-07-20T17:39:04.700 回答