Objective-C是否具有与java注释相同的功能?
我正在尝试做的是创建一个属性,并能够以某种方式访问有关它的一些元数据.
我希望能够确定我的数组中应该包含哪种类型的类,因此我想以某种方式对其进行注释.然后,稍后可以通过运行时库等访问该注释,我可以访问属性列表及其名称.
//Put some sort of annotation giving a class name.
@property (strong) NSArray *myArray;
Run Code Online (Sandbox Code Playgroud)
你说:
我希望能够确定我的数组中应该包含哪种类型的类,因此我想以某种方式对其进行注释.然后,稍后可以通过运行时库等访问该注释,我可以访问属性列表及其名称.
在Objective-C中有几种方法可以做这种事情.Apple的框架通过添加返回所需信息的类方法来完成此类操作.例如:依赖键在志愿,+[CALayer needsDisplayForKey:]以及相关方法.
因此,让我们创建一个类方法,该方法返回一个类数组,这些类可以在给定属性名称的情况下进入容器属性.首先,我们将添加一个类别NSObject来实现该方法的通用版本:
@interface NSObject (allowedClassesForContainerProperty)
+ (NSArray *)allowedClassesForContainerPropertyWithName:(NSString *)name;
@end
@implementation NSObject (allowedClassesForContainerProperty)
+ (NSArray *)allowedClassesForContainerPropertyWithName:(NSString *)name {
if (class_getProperty(self, name.UTF8String)) {
return @[ [NSObject class] ];
} else {
[NSException raise:NSInvalidArgumentException
format:@"%s called for non-existent property %@", __func__, name];
abort();
}
}
@end
Run Code Online (Sandbox Code Playgroud)
如您所见,该方法的默认版本没有做任何特别有用的事情.但添加它NSObject意味着我们可以将消息发送到任何类,而不必担心该类是否实现该方法.
为了使消息返回有用的东西,我们在自己的类中覆盖它.例如:
@implementation MyViewController
+ (NSArray *)allowedClassesForContainerPropertyWithName:(NSString *)name {
if ([name isEqualToString:@"myArray"]) {
return @[ [UIButton class], [UIImageView class] ];
} else {
return [super allowedClassesForContainerPropertyWithName:name];
}
}
...
Run Code Online (Sandbox Code Playgroud)
我们可以像这样使用它:
SomeViewController *vc = ...;
SomeObject *object = ...;
if ([[vc.class allowedClassesForContainerPropertyWithName:@"bucket"] containsObject:object.class]) {
[vc.bucket addObject:object];
} else {
// oops, not supposed to put object in vc.bucket
}
Run Code Online (Sandbox Code Playgroud)
本功能没有本机支持,但您可以查看以下解决方案 - https://github.com/epam/lib-obj-c-attr/这是属性的编译时实现.基于定义而非注释的属性定义,如在其他解决方案中,如ObjectiveCAnnotate.
| 归档时间: |
|
| 查看次数: |
8862 次 |
| 最近记录: |