Does Objective-C have an equivalent to java annotations?

前端 未结 8 1080
后悔当初
后悔当初 2020-12-28 09:10

Does Objective-C have an equivalent to java annotations?

What\'s I\'m trying to do is create a property and be able to somehow access some metadata about it.

相关标签:
8条回答
  • 2020-12-28 09:51

    No, Objective-C has no annotation or generics support.


    A way to implement such a thing would be to hack Clang to read comments and associate a metadata object to the original object. But, you would be tied to your hacked compiler.

    NSString *v1 = [[NSString alloc] init];
    
    // associate
    static char key;
    NSString *v2 = [[NSString alloc] init];
    objc_setAssociatedObject (
        v1,
        &key,
        v2,
        OBJC_ASSOCIATION_RETAIN
    );
    
    // retrieve
    NSString *associate = (NSString *)objc_getAssociatedObject(v1, &key);
    

    Qualifying with a protocol wouldn't be much trouble, and you could test if the collection implements it, but along the way you would need to create a category for each type on the same collection. This would require a different collection at compile time using macros. Overly complicated.

    @interface Tomato:NSObject @end
    @implementation Tomato @end
    
    @protocol TomatoNSArray <NSObject>
    - (Tomato*)objectAtIndexedSubscript:(NSUInteger)index;
    - (void)setObject:(Tomato*)tomato atIndexedSubscript:(NSUInteger)index;
    @end
    
    // here is the problem, you would need to create one of this for each type
    @interface NSMutableArray (TomatoNSArray) <TomatoNSArray>
    @end
    
    int main(int argc, char *argv[]) {
        @autoreleasepool {
            NSMutableArray<TomatoNSArray> *tomatoes = [[NSMutableArray alloc] initWithCapacity:2];
            tomatoes[0] = [Tomato new];
            tomatoes[1] = [NSObject new]; // warning: incompatible pointer types 
        }
    }
    
    0 讨论(0)
  • 2020-12-28 09:55

    There is no native support of this functionality, but you may to take a look at following solution — https://github.com/epam/lib-obj-c-attr/ It is compile time implementation of attributes. Definition of attributes based on defines but not on comments as in other solutions like ObjectiveCAnnotate.

    0 讨论(0)
提交回复
热议问题