关于WMZBanner的怪异写法探究#
关于WMZBanner的怪异写法探究#
1、看懂宏定义#
定义部分
#define WMZBannerPropSetFuncImplementation(className,propertyPointerType,propertyName) - (className * (^) (propertyPointerType propertyName))propertyName##Set{ \
return ^(propertyPointerType propertyName) { \
self->_##propertyName = propertyName; \
return self; \
}; \
}调用环节
WMZBannerPropSetFuncImplementation(NSMutableArray, int, ss); 以上写法等同于👇🏻
- (NSMutableArray * (^)(int ss))ssSet{
return ^(int ss) {
self->_ss = ss;
return self;
};
}2、点语法的外界调用#
定义部分
typedef id(^JobsReturnIDByIDBlock)(id data);/// 用于 @interface
#define JobsInterface(className,propertyModifier,propertyPointerType,propertyName) \
@property(nonatomic,propertyModifier)propertyPointerType propertyName; \
-(className *(^)(propertyPointerType propertyName)) propertyName##Set;/// 用于 @implementation
#define JobsImplementation(className,propertyPointerType,propertyName) \
- (className * (^) (propertyPointerType propertyName))propertyName##Set{ \
return ^(propertyPointerType propertyName) { \
self->_##propertyName = propertyName; \
return self; \
}; \
}Hello.h文件
#import <Foundation/Foundation.h>
#import "WMZBannerConfig.h"
#import "JobsBlock.h"
NS_ASSUME_NONNULL_BEGIN
@interface Hello : NSObject
JobsInterface(Hello, assign, JobsReturnIDByIDBlock, block)
@end
NS_ASSUME_NONNULL_ENDHello.m文件
#import "Hello.h"
@implementation Hello
JobsImplementation(Hello, JobsReturnIDByIDBlock, block)
@end调用环节
在其他的类引入Hello.h
Hello *hello = Hello.new.blockSet(^(id data) {
return @"";
});