要运行示例项目,克隆仓库,并首先从 Example 目录运行 pod install
。
在 Example/Tests/Tests.m
中有一个测试用例。理解如何在 Objective-C 中编写 mix-in 是一个好的开始。
#import <ObjCMixin/ObjCMixin.h>
声明一个模块。
@module(MyModule)
@property(nonatomic, strong) NSString *prefix;
- (void)saySomething:(NSString *)something;
@end
在一个 .m
文件中实现模块方法。
@module_implementation(MyModule)
// Module must implement methods required by property explicitly.
- (NSString *)prefix {
// Use `module_ivar` to retrieve a variable in module.
return module_ivar(self, prefix);
}
- (void)setPrefix:(NSString *)prefix {
// Update module instance variable.
module_ivar(self, prefix) = prefix;
}
// Implement method as usual.
- (void)saySomething:(NSString *)something {
NSString *prefix = _prefix;
NSLog(@"%@: %@", prefix, something);
}
@end
声明一个接口。
@interface Foo : NSObject<MyModule>
- (void)foo;
@end
在 .m
文件中实现 Foo 的方法,并将其与 MyModule
混入。
@mixin(Foo, MyModule)
@implementation Foo
- (void)foo {
NSLog(@"Foo");
}
@end
使用 Foo
调用 MyModule
中的方法。
Foo *f = [[Foo alloc] init];
[f hello];
[f foo];
f.prefix = @"Hey";
NSLog(@"%@, you!", f.prefix);
ObjCMixin 提供以下宏来使混入更酷。
@module(ModuleName)
:声明一个模块。@module_implementation(ModuleName)
:实现模块方法。@mixin(TargetClass, ModuleName)
:将模块中的所有方法复制到 TargetClass
中。module_ivar(self, ivar)
:获取或设置与模块实例绑定的变量。ObjCMixin 使用 Objective-C 运行时 API 来捣鼓类。由于运行时 API 的限制,ObjCMixin 只能将模块方法复制到目标类。无法从模块类复制实例变量和合成属性到目标类。
基本上,可以将模块视为一个 分类。模块和分类之间的唯一区别是模块中的代码可以与多个接口共享。
ObjCMixin 通过 CocoaPods 提供。要安装它,只需将以下行添加到您的 Podfile 中:
pod "ObjCMixin", "~> 0.1.0"
Huan Du,[email protected]
ObjCMixin 采用 MIT 许可协议。更多详情请参阅 LICENSE 文件。