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

2 つの主な問題:

  • キー名が配列になっているのはなぜですか?
  • NSString* を == と比較するべきではありません。

また、おそらく言語コードを使用したいと思うでしょう。

2 つの「Objective-C」オプション、1 つのハッキー オプション、および 1 つの「C」オプションを考えることができます。

  1. 辞書に格納します。これは、たくさんの辞書を作成し、そのうちの 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 に答える