我想知道是否有一种简单快捷的方法将属性名称从已采用的协议映射到已经来自基类的属性?
假设示例:
<form method="POST" action="add.php" id="myform">
在这种情况下,我想我不需要做任何事情 - 该属性与getter和setter一起存在,因此在采用协议时给予它们的承诺得以实现。但是如果@protocol Proto <NSObject>
@property (nonatomic, readonly, strong) NSString *objectId;
@end
...
@interface MyBase : NSObject
@property (nonatomic, readonly, strong) NSString *objectId;
@end
...
@interface MyClass : MyBase<Proto>
@end
中的属性被称为MyBase
而不是 objId
会怎样?是否有使用objectId
,dynamic
,synthesize
或任何其他方式使其引用基类属性的语言技巧,而无需在getter=
中手动定义getter / setter并返回/设置基类'属性?
理由:我希望通过协议层覆盖第三方库,这将由UI使用,以便我可以轻松地将提供商更改为另一个类似的提供商(或提供模拟器)用于检测)。我定义的协议主要复制这个库的API,但是一些属性名称包括它们的命名,我不希望它在我的接口中。
答案 0 :(得分:1)
Objective-C确实提供了诸如-(id)forwardingTargetForSelector:(SEL)aSelector
之类的钩子,它与Ruby的method_missing
非常相似。您可以使用它将Objective-C消息重定向到其他对象和/或选择器。因此,如果您在属性中具有一致但不同的命名模式,例如* objectId - &gt; objId,你可以使用它。 CAVEAT使用任何这些东西都是有风险的 - 如果你可以用一些覆盖完成同样的事情,那就改为做。你的代码将不那么脆弱,即使它不是那么干净