1

初期化された静的ディクショナリがあり、データがdifferent.mファイルに追加されています。現在、ビューコントローラにその静的ディクショナリが必要です。辞書には実際にはキーとしてキャリア名が含まれ、値としてそれぞれの番号が含まれているので、私が一番やりたいのは、電話がどのキャリアに属しているかを確認してから、対応する番号を取得することです。静的ディクショナリが形成された.mファイルはConfig.mであり、実際に静的ディクショナリを返すメソッドがあります。

+ (NSDictionary*) getMccMncToCodeDictionary
{
    return mccMncLISDictionary;
} 

私がViewControllerで行ったことは、次のとおりです。

Config* network_number = [[Config alloc] init];
network_number = [Config getMccMncToLISCodeDictionary];
NSLog(@"network number:::%@", network_number);

私のコンソールでは、

network number:::(null)

私が受け取る警告(黄色のエラー)は、ViewControllerのコードの2行目にある「NSDictionary*から'Config*_strong'に割り当てられている互換性のないポインター型」です。

私のinitLISDictionaryコード:

- (void) initLISDictionary
{ 
NSString* MCC = @"520";
NSString* CAT3G = [NSString stringWithFormat:@"%@00",MCC];
NSString* AIS = [NSString stringWithFormat:@"%@01",MCC];
NSString* CAT_CDMA =[NSString stringWithFormat:@"%@02",MCC];
NSString* TOT3G = [NSString stringWithFormat:@"%@15",MCC];
NSString* DTAC = [NSString stringWithFormat:@"%@18",MCC];
NSString* AIS_GSM_1800 = [NSString stringWithFormat:@"%@23",MCC];
NSString* TRUE_MOVE_H = [NSString stringWithFormat:@"%@88",MCC];
NSString* TRUE_MOVE = [NSString stringWithFormat:@"%@99",MCC];

mccMncLISCodeDictionary = [NSMutableDictionary dictionary];
[mccMncLISCodeDictionary setValue:[NSNumber numberWithInt:2] forKey:CAT3G];
[mccMncLISCodeDictionary setValue:[NSNumber numberWithInt:1] forKey:AIS];
[mccMncLISCodeDictionary setValue:[NSNumber numberWithInt:2] forKey:CAT_CDMA];
[mccMncLISCodeDictionary setValue:[NSNumber numberWithInt:4] forKey:TOT3G];
[mccMncLISCodeDictionary setValue:[NSNumber numberWithInt:3] forKey:DTAC];
[mccMncLISCodeDictionary setValue:[NSNumber numberWithInt:1] forKey:AIS_GSM_1800];
[mccMncLISCodeDictionary setValue:[NSNumber numberWithInt:5] forKey:TRUE_MOVE];
[mccMncLISCodeDictionary setValue:[NSNumber numberWithInt:5] forKey:TRUE_MOVE_H];
}
4

3 に答える 3

2

もちろん、これは機能しません。

Config* network_number = [[Config alloc] init];
network_number = [Config getMccMncToLISCodeDictionary];
NSLog(@"network number:::%@", network_number);

このコードは新しい Config オブジェクトを開始しますが、network_number を呼び出すときは CLASS メソッドを呼び出しているため、以前に開始したことには何の価値もありません。以下を呼び出せるように、インスタンス メソッドにする必要があります (+ を - に変更し、ヘッダーで宣言されていることを確認するだけです)。

Config* network_number = [[Config alloc] init];
network_number = [network_number getMccMncToLISCodeDictionary];

または、クラスメソッドを完全に自己完結させる必要がありますが、それがあなたが望むものではないことは確かです。

編集:

+ (NSDictionary*) getMccMncToCodeDictionary
{

NSString* MCC = @"520";
NSString* CAT3G = [NSString stringWithFormat:@"%@00",MCC];
NSString* AIS = [NSString stringWithFormat:@"%@01",MCC];
NSString* CAT_CDMA =[NSString stringWithFormat:@"%@02",MCC];
NSString* TOT3G = [NSString stringWithFormat:@"%@15",MCC];
NSString* DTAC = [NSString stringWithFormat:@"%@18",MCC];
NSString* AIS_GSM_1800 = [NSString stringWithFormat:@"%@23",MCC];
NSString* TRUE_MOVE_H = [NSString stringWithFormat:@"%@88",MCC];
NSString* TRUE_MOVE = [NSString stringWithFormat:@"%@99",MCC];

mccMncLISCodeDictionary = [NSMutableDictionary dictionary];
[mccMncLISCodeDictionary setValue:[NSNumber numberWithInt:2] forKey:CAT3G];
[mccMncLISCodeDictionary setValue:[NSNumber numberWithInt:1] forKey:AIS];
[mccMncLISCodeDictionary setValue:[NSNumber numberWithInt:2] forKey:CAT_CDMA];
[mccMncLISCodeDictionary setValue:[NSNumber numberWithInt:4] forKey:TOT3G];
[mccMncLISCodeDictionary setValue:[NSNumber numberWithInt:3] forKey:DTAC];
[mccMncLISCodeDictionary setValue:[NSNumber numberWithInt:1] forKey:AIS_GSM_1800];
[mccMncLISCodeDictionary setValue:[NSNumber numberWithInt:5] forKey:TRUE_MOVE];
[mccMncLISCodeDictionary setValue:[NSNumber numberWithInt:5] forKey:TRUE_MOVE_H];

return mccMncLISDictionary;
}

これは、あなたがやろうとしていることに最も近いものです。

これらの2行を使用するだけで、initを無視します

NSMutableDictionary *network_number = [Config getMccMncToLISCodeDictionary];
NSLog(@"network number:::%@", network_number);
于 2013-03-15T19:05:02.993 に答える
1

initLISDictionaryメソッドをクラスメソッドにしてみてください。そうすれば、次のことができます。

+ (NSDictionary*) getMccMncToCodeDictionary
{
    if (mccMncLISDictionary == nil) {
        [Config initLISDictionary];
    }
    return mccMncLISDictionary;
}

ただし、mccMncLISCodeDictionaryの代わりに初期化も行っmccMncLISDictionaryているため、それもまっすぐにする必要があります。

やったほうがいい:

NSDictionary *network_number = [Config getMccMncToLISCodeDictionary];
NSLog(@"network number:::%@", network_number);

このメソッドを呼び出しているので、その戻りタイプはNSDictionaryです。

+ (NSDictionary*) getMccMncToCodeDictionary
{
    return mccMncLISDictionary;
}
于 2013-03-15T18:23:17.497 に答える