我发现Objective-C对象属性可以标记为@dynamic
,让编译器知道实现在运行时可用。我想知道是否有办法告诉编译器对象的所有属性都是动态的,而不是逐个明确地指定它们(我没有预先列出的属性)。我知道如果我只使用[object something]
这不会有问题,但出于文体目的,我想使用object.something
语法。
我很确定这样做是不可能的,但我希望有人确认一下。由于这不适用于生产,因此解决方案可能涉及您可以想象的任何事情。
感谢。
其他信息:
-something
(getter)工作,所以如果你的解决方案不支持设置好的话。示例:
@interface MagicalClass : NSObject
// property 'something' is not defined!
@end
@implementation MagicalClass
- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector { ... }
- (void)forwardInvocation:(NSInvocation *)anInvocation { ... }
@end
MagicalClass *obj = [[MagicalClass alloc] init];
[obj something]; // compiler warning
obj.something; // compiler error
答案 0 :(得分:4)
这实际上不适用于声明的属性。它们的重点在于,您可以预先声明您的属性以及与它们进行交互的方式。如果您没有任何声明,那么您没有任何声明的属性。
不幸的是,它也无法使用简单消息 well ,尽管它可以比点语法更好地工作。 Objective-C的静态类型检查会抛出一系列警告,如果任何属性属于非对象类型,它可能无法生成正确的调用代码。
这种事情在Python和Ruby等语言中很常见,不需要声明事物,但它与Objective-C不能很好地融合。在Objective-C中,访问任意属性通常使用字符串(参见Key-Value Coding和NSAttributedString)。
答案 1 :(得分:2)
我不相信这是可能的。如果您使用id
类型,则可以发送未声明的消息,但点语法实际上依赖于了解您的特定访问者。
答案 2 :(得分:0)
我没试过,但是如果你提供了一个getter和setter,Xcode是否还需要@synthesize
或@dynamic
指令?
因此,如果您的财产被称为something
,请实施-setSomething:
和-something
。