Objective-C中將結構體與聯合體封裝爲NSValue對象

在Clang 3.7以前,Objective-C已經能夠使用相似@100、@YES、@10.5f等字面量表示一個NSNumber對象;用相似@"xxx"的字面量表示一個NSString對象;用@[]字面量表示一個NSArray對象;用@{}字面量表示一個NSDictionary對象;用@(expr)字面量根據expr的類型來表示其對應的上述類型的其中之一,此外還包括一個類型——NSValue。spa


在Clang3.7中引入了__attribute__((objc_boxable))屬性,若是咱們定義的某一結構體或聯合體用該屬性修飾,那麼此結構體或聯合體便可用@()方式封裝爲一個NSValue對象。下面咱們就來舉一個簡單的例子:code

    struct __attribute__((objc_boxable)) StructA
    {
        int a;
        float f;
    };
    
    // 這裏使用了C99中所引入的結構體複合字面量表達形式以及designated initializer
    NSValue *value = @((struct StructA){.a = 10, .f = 0.5f});
    
    struct StructA sa;
    
    [value getValue:&sa];
    
    NSLog(@"The value is: %.1f", sa.a + sa.f);

上述代碼中咱們看到,一個結構體對象經過@()被封裝爲了一個NSValue對象。而咱們能夠使用NSValue類中的getValue方法將其所封裝的結構體或聯合體的內容徹底返回出來。對象

相關文章
相關標籤/搜索