2010-03-28 39 views
0

假設我有以下幾點:iPhone - 保持字符串列表和相應的typedef枚舉

typedef enum functionType {ln, sin, sqrt} functionType; 
NSArray *functions = [NSArray arrayWithObjects: @"ln", @"sin", @"sqrt", nil]; 

進一步假設*功能將無法在運行時更改。

問題 - 是否有任何方法可以設置更新這兩個結構的單個結構?所以我只需要跟蹤一個列表,而不是兩個。

爲了解釋發生了什麼 - 這個想法是來自用戶的字符串輸入將被存儲在類型爲functionType的變量中。稍後,我將得到如下代碼:

double valueOfFunction: (functionType) function withInput: (double) input 
    switch (function) { 
    case ln: 
     return ln(input); 
    case sin: 
     return sin(input); 
    case sqrt: 
     return sqrt(input); 
    //etc . . . could grow to include a lot of functions. 
    } 

而且valueOfFunction需要很快。所以我不想在那裏做字符串比較。

+0

我問了一個類似的問題,但沒有得到任何滿意的答案:http://stackoverflow.com/questions/1344801/converting-enum-into-a-class-hierarchy – 2010-03-28 20:38:56

回答

4

這聽起來像你想從字符串映射到枚舉對象。有很多方法可以做到這一點。

您可以使用NSDictionary和NSString鍵以及代表對象的NSNumber編碼的整數。您可以使用函數名稱(@「ln」,@「sin」等)的NSArray,並且只將索引存儲到數組中;這基本上擺脫了枚舉。

如果你真的想枚舉類型和字符串對象的列表加盟,你也可以做這樣的事情:

typedef enum FunctionType { 
    ln, sin, cos, tan, exp 
} FunctionType; 

typedef struct FunctionItem { 
    FunctionType type; 
    NSString *name; 
} FunctionItem; 

FunctionItem functions[] = { 
    {ln, @"ln"}, 
    {sin, @"sin"}, 
    {cos, @"cos"}, 
    {tan, @"tan"}, 
    {exp, @"exp"}, 
}; 

當心符號衝突,但!你不能有一個名爲sin的枚舉標識符,也可以使用標準的sin()函數。

祝你好運與你的計算器類型的應用程序!

+0

只是評論 - 你在說什麼是沒有辦法去做我真正想要的東西,那就是在枚舉名和NSString對象之間有一些類型的自動對應關係。我必須自己跟蹤他們。這就是說,+1,因爲你提供給我最好的現有替代品。 – 2010-03-29 19:03:04