2012-03-16 15 views
0

私のソースコードで配列をいくつかの事前定義された値で初期化できる必要があります。しかし、各配列はおそらく何千もの値を持つことになります。私のソースコードとインライン値の数千を持ってすることなく多数の値を持つ配列と辞書を初期化する

私は(例えば)initialseにはどうすればよい
@"key",@"value", 
@"key",@"value", 
@"key",@"value", 
@"key",@"value", 
...etc... 

これらの値でNSDictionary、すなわちこのような何か:

tokens = [[NSDictionary alloc] initWithObjectsAndKeys: 
    #import "keyvaluepairs1.h" 
    #import "keyvaluepairs2.h" 
    , nil]; 

あるいは単に純粋このような配列:

char[] tokens = { 
    #import "schoolnames.h" 
    #import "universitynames.h" 
    } 

私が探しています何がObjective-Cの「トリック」ではありませんが、Cでコンパイラのインポートを指示するか、吸うことができます方法についての理解をより他のファイルの存在。私は必要に応じてこれを達成する方法について、他のアイデアを公開しています。

+0

からロードされるたびにそのようなプリプロセッサを乱用しないでくださいを読み取ることが必要とされるであろう... –

+0

ソースコードに10,000個の値をコピーして貼り付けることを避けるにはどうすればよいですか? – Jacob

答えて

0

多くの検索をした後、私はどこでもテキストファイルが存在することを確認することなくこれを達成する簡単な方法を見つけたと思います。私が持つ大きな問題を見ることができない、データは決して変わらないことを考えると

tokens = [[NSDictionary alloc] initWithObjectsAndKeys: 
    SAMPLE_ARRAY 
    SAMPLE_ARRAY2 
    nil]; 

#define SAMPLE_ARRAY \ 
@"a", @"value",\ 
@"b", @"value",\ 
@"c", @"value",\ 
...etc... 

そしてインポートまたは、このようにそれらを使用する:あなたは、あなたのヘッダファイルは次のように見えるようにすることができますこの。

0

上記の形式のテキストファイルの場合は、データをNSDictionaryに読み込むための簡単なパーサーを作成する必要があります。

"ボキャブラリ"という形式は単純なので、NSScannerに基づくリニアパーサーは簡単に実装できます。

+0

まさに私が考えていたものです。 – drekka

+0

これは、アプリケーション/バイナリが実行されるたびにテキストファイルを解析する必要があることを意味します。 – Jacob

3

NSArraysのNSDictionaryであるplistを作成することができます。その後、簡単にplistをNSDictionaryに読み込んでから各配列を取得します。指摘したように

NSString *path = [[NSBundle mainBundle] pathForResource:@"yourFile" ofType:@"plist"]; 
NSMutableDictionary *dict = [[NSMutableDictionary alloc] initWithContentsOfFile:path]; 
NSArray *array = [dict objectForKey:@"array1"]; 

が、これは少なくとも一度アプリが「実行していない」状態

+0

それは確かにそれを行うきちんとした目的cの方法です、私はそれが好きです。人々はこのオプションをより頻繁に検討すべきです。特に、パーサーコードを書く必要がないためです。 – Jacob

+0

plistは非常に便利で、解析が簡単です。 plistのデータ構造はJSONと同様に扱うことができ、配列、辞書、文字列、数値のグループを独自に定義することができます。これにより、非常に汎用性があります。 – dmanxiii

関連する問題