iOS开发---结构体浅析

2019-06-24  本文已影响0人  Cary_Xu

结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合,叫做结构。

一、结构体的使用场景

  在开发过程中,经常需要处理一组不同类型的数据,比如由姓名、年龄、性别等参数组成的学生信息。因为这些数据是由不同数据类型组成的,因此不能用数组表示,此时我们可以考虑采用结构体或者类来进行存储。

二、结构体的特点

三、结构体的定义与调用

1、先定义结构体类型,再定义变量
struct 结构体名{
    类型名 成员名1;
    类型名 成员名2;
    ... ...
    类型名 成员名n;
};

  1.1、定义:

@interface ViewController ()
struct CYStudentInfo{
    NSString *name;
    int       age;
    BOOL      sex;
};
@end

  1.2、调用:

@implementation ViewController
- (void)viewDidLoad {
    [super viewDidLoad];

//    struct CYStudentInfo student0;
//    student0.name = @"陈二狗";
//    student0.age  = 20;
//    student0.sex  = 1;
    struct CYStudentInfo student0 = {@"陈二狗",20,1};

    NSLog(@"stdName=%@,stdAge=%d,stdSex=%d",student0.name,student0.age,student0.sex);
}
@end

  1.3、使用typedef对数据类型进行重命名:

typedef struct {
    NSString *name;
    int       age;
    BOOL      sex;
} CYStudentInfo;

  使用typedef可以在调用的时候省略struct

//    CYStudentInfo student1;
//    student1.name = @"陈二狗";
//    student1.age  = 20;
//    student1.sex  = 1;
    
    CYStudentInfo student1 = {@"陈二狗",20,1};
    
    NSLog(@"stdName=%@,stdAge=%d,stdSex=%d",student1.name,student1.age,student1.sex);
2、先定义变量,在定义结构体类型
struct {
    类型名 成员名1;
    类型名 成员名2;
    ... ...
    类型名 成员名n;
} 变量名,变量名,... ...;

  2.1、定义:

@implementation ViewController
struct {
    NSString *name;
    int       age;
    BOOL      sex;
} student2,student3;
@end

  2.2、调用:

@implementation ViewController
struct {
    NSString *name;
    int       age;
    BOOL      sex;
} student2,student3;

- (void)viewDidLoad {
    [super viewDidLoad];
    
    student2.name = @"陈二狗";
    student2.age  = 20;
    student2.sex  = 1;
    
    student3.name = @"沐小夭";
    student3.age  = 18;
    student3.sex  = 0;

    NSLog(@"stdName=%@,stdAge=%d,stdSex=%d",student2.name,student2.age,student2.sex);
    NSLog(@"stdName=%@,stdAge=%d,stdSex=%d",student3.name,student3.age,student3.sex);
}
@end
3、定义结构体类型的同时定义变量
struct 结构体名{
    类型名 成员名1;
    类型名 成员名2;
    ... ...
    类型名 成员名n;
} 变量名,变量名,... ...;

  3.1、定义

@implementation ViewController

struct CYStudentInfo{
    NSString *name;
    int       age;
    BOOL      sex;
} student4,student5;
@end

  3.2、调用

@implementation ViewController

struct CYStudentInfo{
    NSString *name;
    int       age;
    BOOL      sex;
} student4,student5;

- (void)viewDidLoad {
    [super viewDidLoad];
    
//        student4.name = @"陈二狗";
//        student4.age  = 20;
//        student4.sex  = 1;
//
//        student5.name = @"沐小夭";
//        student5.age  = 18;
//        student5.sex  = 0;
    
    struct CYStudentInfo student4 = {@"陈二狗",20,1};
    struct CYStudentInfo student5 = {@"沐小夭",18,0};
    
    NSLog(@"stdName=%@,stdAge=%d,stdSex=%d",student4.name,student4.age,student4.sex);
    NSLog(@"stdName=%@,stdAge=%d,stdSex=%d",student5.name,student5.age,student5.sex);
}
@end
4、归根溯源

  4.1、APPLE官方写法

struct CGRect {
    CGPoint origin;
    CGSize size;
};
typedef struct CG_BOXABLE CGRect CGRect;

  使用typedef是为了输入时可以直接使用CGRect而不必再输入struct。
  CG_BOXABLE是什么意思呢?在CoreGraphics/CGBase.h中,有这样的定义:

#if defined(__has_attribute) && __has_attribute(objc_boxable)
# define CG_BOXABLE __attribute__((objc_boxable))
#else
# define CG_BOXABLE
#endif

  可以看到其实是attribute((objc_boxable)),它可以允许将结构体进行快速打包,这样我们就可以使用@()快速地将它转换成NSValue了。
  4.2、定义

struct CYStudentInfo{
    NSString *name;
    int       age;
    BOOL      sex;
};
typedef struct CG_BOXABLE CYStudentInfo CYStudentInfo;

  4.3、调用

- (void)viewDidLoad {
    [super viewDidLoad];
    
    CYStudentInfo student6 = {@"陈二狗",20,1};
    NSLog(@"stdName=%@,stdAge=%d,stdSex=%d",student6.name,student6.age,student6.sex);
    
    struct CYStudentInfo student7 = {@"沐小夭",18,0};
    NSLog(@"stdName=%@,stdAge=%d,stdSex=%d",student7.name,student7.age,student7.sex);
    
    NSMutableArray *arrayStd = [NSMutableArray array];
//    NSValue *value = nil;
//    value = [NSValue valueWithBytes:&student6 objCType:@encode(CYStudentInfo)];
//    [arrayStd addObject:value];
//    value = [NSValue valueWithBytes:&student7 objCType:@encode(CYStudentInfo)];
//    [arrayStd addObject:value];
    [arrayStd addObject:@(student6)];
    [arrayStd addObject:@(student7)];
    
    for (NSValue *value in arrayStd) {
        CYStudentInfo student;
        [value getValue:&student];
        NSLog(@"stdName=%@,stdAge=%d,stdSex=%d",student.name,student.age,student.sex);
    }
}

四、总结

上一篇下一篇

猜你喜欢

热点阅读