簡體   English   中英

“ NS_ENUM”的第一個值實際上是什么類型?

[英]What's the type of the first value of `NS_ENUM` actually is?

眾所周知, NS_ENUM是Apple定義的宏,通過它我們可以輕松地定義包含一組值的枚舉類型。 有兩個事實:

  • ENUM中的值類型為NSInteger ,實際上是基於C的類型。
  • 基於C的類型變量不能傳遞給Objective-C的類型參數。

問題描述:

我定義了一個包含三個值的NS_ENUM類型。 而且我需要將此枚舉類型值用作清除id類型的塊變量的參數。 當我將定義的枚舉類型的第一個值作為block的參數傳遞時,編譯器沒有給我任何提示。 但是,當我傳遞枚舉類型的第二個值時,編譯器向我報告錯誤: ARC不允許將'NSInteger'(aka'long')隱式轉換為'id',並且警告說不兼容的整數將指針傳遞給'NSInteger '(aka'long')到'__strong id'類型的參數

這意味着基於變量的C基類型不能轉換為Objective-C類型。

所以問題是為什么我可以傳遞的第一個值而不傳遞第二個值?

定義枚舉時,將為每個枚舉值提供一個從0開始的下一個整數值。這意味着第一個枚舉值的值為0,第二個枚舉值的值為1,依此類推。

可以將第一個枚舉值用作id類型的參數的原因是,編譯器實際上傳遞了枚舉的值(第一個枚舉值為0)。 0和nil確實是同一回事。

換句話說,傳遞第一個枚舉值(值為0)與傳遞nil相同。 因此,編譯器不會抱怨,因為可以通過nil

但是對於任何其他(非零)枚舉值,編譯器都會看到NSInteger值,並正確地抱怨您無法將NSInteger值傳遞給id類型的參數。

在大多數情況下,正確的解決方案是將枚舉值包裝為NSNumber 最好的方法是為此使用現代@( )語法。

SomeEnumType myEnumVariable = SomeEnumValue;
[someInstance someMethod:@(myEnumVariable)];

其中someMethod:需要一個id對象。 在這種情況下,它將獲得包裝枚舉值的NSNumber

當然,必須編寫someMethod以期望以這種方式發送值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM