iOS 如何包装结构体

大家都知道,iOS中数组是无法存放基本数据类型的。

  • 基本数据类型转对象,这个我相信大家都知道。
    int a = 10;
    NSNumber *aNumber = @(a);
    NSMutableArray *arrM = [NSMutableArray array];
  • 那么结构体呢?
    结构体我们分成两种,第一种是系统的,第二种是自定义的。

    • 系统结构体包装成对象
      CGPoint point = CGPointMake(0, 0);
      NSMutableArray *arrM = [NSMutableArray array];
      [arrM addObject:@(point)];// 将系统结构体包装成对象保存到数组中
      for (NSValue *obj in arrM) {
          CGPoint point = [obj CGPointValue];// 从对象中获取结构体
          NSLog(@"point = %@", NSStringFromCGPoint(point));
      }
    
    • 自定义结构体包装成对象(注意点:自定义的结构体只有进行CG_BOXABLE包装之后才能像系统结构体那样子操作)
      // 这是视频信息结构体。包含视频的 大小 和 时长 
      struct VideoInfo {
      double videoSize;
      double videoDuration;
      };
      typedef struct CG_BOXABLE VideoInfo VideoInfo;// 这是最关键的代码。去看系统的结构体,你也会发现系统的结构体也做了这一步操作。
    
      // 自定义结构体的包装
      VideoInfo info;
      info.videoSize = 2533329.0;// 假设视频大小为2533329.0
      info.videoDuration = 10;// 假设视频10s
      NSMutableArray *arrM = [NSMutableArray array];
      [arrM addObject:@(info)];// 自定义结构体经过CG_BOXABLE之后可以像系统结构体一样操作。、
      for (NSValue *obj in arrM) {
          // 从对象中获取结构体,这里和系统结构体的获取方法有点差异。
          VideoInfo info;
          [obj getValue:&info];
          NSLog(@"size = %lf, videoDuration = %lf", info.videoSize, info.videoDuration);
      }
    

你可能感兴趣的:(iOS 如何包装结构体)