2017-10-18 114 views
0

以前我有一個方法可以完成一些需要BOOL的任務。在XCode中對BOOL進行ENUM轉換的警告

-(void)processUserBasedonStatus:(BOOL)newUser 

然後我定義的NS_ENUM接受更多的國家這樣

typedef NS_ENUM(NSInteger, Status) 
{ 
    StatusNewUser=0, 
    StatusCurrentUser, 
    StatusOldUser, 
    StatusOther 
}; 

和更新的方法來使用新的ENUM PARAM

-(void)processUserBasedonStatus:(Status)userStatus 

一切運作良好,除了Xcode中沒不會抱怨忘記更新通話方式的地方,例如

[self processUserBasedonStatus:YES]; 
[self processUserBasedonStatus:NO]; 

在這種情況下,YES & NO只會映射到ENUM的前2個值。我嘗試了Xcode中的警告列表,但沒有任何東西允許編譯器提出這個警告。

有沒有辦法讓編譯器警告我們這種類型的行爲?

+0

Objective-C中'NO'被定義爲'0',YES被定義爲'1',所以它是完全合法的。 – vadian

+0

嗯XCode 9.0.1我不能重現這個獲取錯誤'不能初始化類型爲'BOOL'(又名'布爾')'' – schmidt9

+0

@ schmidt9,我剛剛更新到9.0.1和右值類型'狀態'的參數和我沒有得到這個警告。我想知道在您的項目設置中是否啓用了觸發此錯誤的警告? – ArdenDev

回答

0

在(Objective-)C類型_Boolcharintlong和及其無符號對應都是整數類型。由enum定義的類型不是不同的類型本身而是它們基礎整數類型的常量的集合。

Objective-C的類型BOOL要麼是用於_Bool同義詞(typedef#define),或者,所述char類型之一取決於編譯器的版本。

由於整數促銷整數轉換不同整數類型之間的許多分配是自動和無聲的。即使浮點類型可以參與,例如:

bool b = true; 
float f = b; 

是完全合法的,並很可能去註釋掉由編譯器甚至警告。

考慮到所有這些回答你的問題:

有沒有一種方法,使編譯器警告我們這種類型的行爲?

目前看起來「不」 - 代碼在(Objective-)C中是完全合法的。然而,可疑並且可能表示錯誤,並且沒有任何事情停止編譯器發出警告,因爲它對於其他合法但可疑的構造。您可以在bugreport.apple.com上向Apple提交報告(您需要Apple ID才能執行此操作),建議他們添加此警告。