74_iOS乾貨40_結構體和物件的相互轉化 + block的寫法 + 自定義列印
阿新 • • 發佈:2018-11-15
一,結構體和物件的相互轉化
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的寫法
- block作為屬性
-
//block屬性的定義 @property(nonatomic,strong)void(^block)(); //block屬性的使用 Dog *dog = [[Dog alloc]init]; void(^block_MBXB)() = ^(){ NSLog(@"狗狗不可以隨便拉粑粑"); }; dog.block = block_MBXB; dog.block();
-
- block作為引數
-
//block作為方法引數的定義和實現 - (void)eat:(void(^)(NSString*))block; - (void)eat:(void(^)(NSString*))block{ block(@"狗糧"); } //block作為方法引數的使用 Dog *dog = [[Dog alloc]init]; [dog eat:^(NSString *food) { NSLog(@"狗狗吃%@,吃了一大盆",food); }];
-
- block作為返回值
-
//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)
列印的結果示例