2011-08-20 136 views
4

SA, 我所知道的是,Objective-C的是C的限制超..枚舉在Objective-C對C

但是,當我嘗試,我用在用一個非常簡單的例子枚舉C,它並沒有在目標C的工作,

下面的代碼:

#import <Foundation/Foundation.h> 

int main(void) 
{ 
    typedef enum 
    { 
     SUN, MON, TUES 
    }DAYS; 

    DAYS d = MON; 

    NSLog(@"%@", d); 

    return 0; 
} 

#include <stdio.h> 

int main(void) 
{ 
    typedef enum 
    { 
     SUN, MON, TUES 
    }DAYS; 

    DAYS d = MON; 

    printf("%d\n", d); 

    return 0; 
} 

在C,它完美的作品,但在objective-c(我在WIN上使用GNUstep)執行時崩潰(沒有編譯時錯誤)

有誰能告訴我爲什麼?

回答

17

%@是一個對象說明符,枚舉是一個int(有符號或無符號)。要在Objective-C中打印枚舉,您需要在NSLog中使用%d

NSLog(@"%d", d); 

你原來的例子是崩潰,因爲它預期d是一個對象,因此它會試圖發送description消息駐留在內存地址1(的MON值)的對象。

2

由於NSLog(@"%@")聲明而崩潰。 %@格式說明符需要NSObject*(或其子類)的實例,而您通過enum項(int)。

嘗試NSLog("%d\n", d);

2

只需使用的

NSLog(@"%d", d); 

代替

NSLog(@"%@", d); 

記住,在Objective-C,不是一切自動成爲對象。 C中的基元類型仍然是原始類型。因此,在NSLog的格式化字符串中,仍然需要使用您始終使用的相同說明符。

3

試試這個

int main(void) 
{ 
    typedef enum 
    { 
     SUN, MON, TUES 
    }DAYS; 

    DAYS d = MON; 

    NSLog(@"%d", d); //here is your mistake happened, because enum return values are integers. 

    return 0; 
} 

希望這有助於

0

並與盒裝表情,你可以保持在您的格式說明符使用%@:

NSLog(@"%@", @(d)); 

這不正是最佳,但在調試時它確實不成問題。如果您以數百萬的價格傾銷字符串格式的數字,請使用適當的數字格式。