2012-03-16 32 views
0

我需要能夠使用一些預定義的值來初始化我的源代碼中的數組,這看起來有點像下面。然而,每個數組將有可能有數千個值。初始化包含大量值的數組和字典

@"key",@"value", 
@"key",@"value", 
@"key",@"value", 
@"key",@"value", 
...etc... 

如何initialse(例如)的NSDictionary使用這些值,而無需有成千上萬值的內嵌我的源代碼,即是這樣的:

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

,甚至只是一個純粹的數組是這樣的:

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

我在找的是不是一個Objective-C的「絕招」,但關於如何指示編譯進口或在C吸更多的理解其他文件的內容。如果需要,我願意接受其他想法。

+0

加載時,請不要濫用這樣的預處理程序讀取至少一次... – 2012-03-16 02:07:17

+0

如何避免將10,000個值複製並粘貼到我的源代碼中? – Jacob 2012-03-16 02:30:12

回答

0

經過大量搜索,我相信我已經找到了一個簡單的方法來實現這一點,而不必確保文本文件遍佈各處。你可以讓你的頭文件是這樣的:

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

,然後導入或使用它們像這樣:

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

鑑於數據永遠不會改變,我看不出有什麼大問題這個。

0

如果您的文本文件的格式如上所示,則需要編寫一個簡單的解析器將數據讀取到NSDictionary中。

由於格式「詞彙表」很簡單,因此基於NSScanner的線性解析器將很容易實現。

+0

正是我在想什麼。 – drekka 2012-03-16 02:48:31

+0

這意味着每次執行應用程序/二進制文件時都需要解析文本文件。 – Jacob 2012-03-16 02:58:21

3

您可以創建一個plist,它是NSArrays的NSDictionary。然後輕鬆地將plist讀入NSDictionary,然後從中檢索每個數組。

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

正如指出的那樣,這將需要每個應用程序從「未運行」狀態

+0

這當然是一個整潔的客觀的方式來做到這一點,我喜歡它。人們應該更經常地考慮這個選項。尤其是因爲這意味着你不必編寫解析器代碼。 – Jacob 2012-03-16 04:23:51

+0

plist可以非常方便,並且易於解析。我發現plist的數據結構可以被視爲類似於JSONs,允許您定義自己的數組,字典,字符串和數字的分組。這使它非常靈活。 – dmanxiii 2012-03-16 14:00:57