1. 程式人生 > >74_iOS乾貨40_結構體和物件的相互轉化 + block的寫法 + 自定義列印

74_iOS乾貨40_結構體和物件的相互轉化 + block的寫法 + 自定義列印

一,結構體和物件的相互轉化 

1,系統結構體


 //結構體轉NSValue的方法
+ (NSValue *)valueWithCGPoint:(CGPoint)point;
+ (NSValue *)valueWithCGVector:(CGVector)vector;
+ (NSValue *)valueWithCGSize:(CGSize)size;
+ (NSValue *)valueWithCGRect:(CGRect)rect;
+ (NSValue *)valueWithCGAffineTransform:(CGAffineTransform)transform;
+ (NSValue *)valueWithUIEdgeInsets:(UIEdgeInsets)insets;
+ (NSValue *)valueWithUIOffset:(UIOffset)insets NS_AVAILABLE_IOS(5_0);
 
//NSValue轉結構體的方法
- (CGPoint)CGPointValue;
- (CGVector)CGVectorValue;
- (CGSize)CGSizeValue;
- (CGRect)CGRectValue;
- (CGAffineTransform)CGAffineTransformValue;
- (UIEdgeInsets)UIEdgeInsetsValue;
- (UIOffset)UIOffsetValue NS_AVAILABLE_IOS(5_0);
 



//結構體轉NSValue的使用
    CGPoint point = CGPointMake(0, 0);
    NSMutableArray *array = [[NSMutableArray alloc]initWithCapacity:0];
    NSValue *value = [NSValue valueWithCGPoint:point];
    [array addObject:value];

//NSValue轉結構體的使用
    NSValue *tmpValue = array[0];
    CGPoint tmpPoint = [tmpValue CGPointValue];

2,自定義結構體

//   自定義的結構體
    struct Test {
        int ID;
        CGFloat  height;
    };
    typedef struct Test Test;
    
//    自定義結構體封箱操作
    Test tmpTest;
    tmpTest.height = 80.0;
    tmpTest.ID = 100;
    NSLog(@"id==%d,height==%f",tmpTest.ID,tmpTest.height);
    
    NSValue *customValue = [NSValue valueWithBytes:&tmpTest objCType:@encode(struct Test)];

//    拆箱操作
    Test tmpTest1;
    [customValue getValue:&tmpTest1];
    NSLog(@"id==%d,height==%f",tmpTest1.ID,tmpTest1.height);

二,block的寫法

  1. block作為屬性
    1. //block屬性的定義
      @property(nonatomic,strong)void(^block)();
      
      //block屬性的使用
      
      Dog *dog = [[Dog alloc]init];
      
      void(^block_MBXB)() = ^(){
      
      NSLog(@"狗狗不可以隨便拉粑粑");
      
      };
      
      dog.block = block_MBXB;
      
      dog.block();

       

  2. block作為引數
    1. //block作為方法引數的定義和實現
      - (void)eat:(void(^)(NSString*))block;
      - (void)eat:(void(^)(NSString*))block{
      
      block(@"狗糧");
      
      }
      
      
      //block作為方法引數的使用
      Dog *dog = [[Dog alloc]init];
      
      [dog eat:^(NSString *food) {
      
      NSLog(@"狗狗吃%@,吃了一大盆",food);
      
      }];

       

  3. block作為返回值
    1. //block作為返回值的定義和實現
      - (void(^)(int))eatFood;
      - (void(^)(int))eatFood{
      
      return ^(int food){
      
      NSLog(@"狗狗吃了狗糧%d斤",food);
      
      };
      
      }
      
      //block作為返回值的使用
      Dog *dog = [[Dog alloc]init];
      dog.eatFood(200);

       

三,自定義列印

/*列印相關(
分三個部分
1,FILE:當前檔名 + LINE:類的第幾行 + func:函式名稱 
     FILE 巨集在預編譯時會替換成當前的原始檔名
     LINE巨集在預編譯時會替換成當前的行號
     FUNCTION巨集在預編譯時會替換成當前的函式名稱

2,列印的內容 :##__VA_ARGS__
     VA_ARGS 是一個可變引數的巨集,很少人知道這個巨集,這個可變引數的巨集是新的C99規範中新增的,目前似乎只有gcc支援(VC6.0的編譯器不支援)。巨集前面加上##的作用在於,當可變引數的個數為0時,這裡的##起到把前面多餘的”,”去掉的作用,否則會編譯出錯

3,換行符
*/

#define MCLog(format, ...) do {                                                                          \
fprintf(stderr, "<%s : %d> %s\n",[[[NSString stringWithUTF8String:__FILE__] lastPathComponent] UTF8String],__LINE__, __func__);                                                        \
(NSLog)((format), ##__VA_ARGS__);                                           \
fprintf(stderr, "✅✅✅✅✅\n");                                               \
} while (0)

列印的結果示例