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方法将其所封装的结构体或联合体的内容彻底返回出来。对象

相关文章
相关标签/搜索