我需要为iPhone应用程序中的不同配置和设置存储许多 Facebook App Id 和 Twitter Consumer Keys 。
我知道我这样做的方式并不是最好的,因为它有太多的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];
}
答案 0 :(得分:1)
两个主要问题:
您可能也想使用语言代码。
我能想到两个" Objective-C"选项,一个hacky选项,一个" 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>
将其存储在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];
}
}
答案 1 :(得分:0)
那么数据必须存储在某个地方吗?您可以拥有一个单独的类,将数据存储在哈希表中。然后你只需要在每次获得语言时都能引用它。你的代码肯定看起来更干净。查看NSHashTable。