“模拟”实现仅属性协议的对象的最简单方法

埃里克·克伯(Erik Kerber)

请原谅我的疯狂需求,但我正在编写的框架中创建了一堆仅基于属性的协议。

@protocol SomePropertiesOfAnObjectThing <NSObject>

@property (nonatomic, strong) NSString *larry;
@property (nonatomic, strong) NSString *curly;
@property (nonatomic, strong) NSString *moe;

@end

有没有一种方法,更重要的是一种简单的方法,可以“模拟”出实现此协议的对象?

id<SomePropertiesOfAnObjectThing> thingy = [ProtocolObject fromProtocol:@protocol(SomePropertiesOfAnObjectThing)];

thingy.larry = @"fizz";
thingy.curly = @"buzz";
thingy.moe = @"bar";

我想避免的两件事:

  1. 明确创建一个新类
  2. 第三方依赖性(例如OCMock)

我会给任何可以给我展示干净便捷的方式(得票数至少为1)的人洗个澡。

埃里克·克伯(Erik Kerber)

我朴素的解决方案如下:

- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector {
    return [[self class] instanceMethodSignatureForSelector:@selector(foo:)];
}

- (void)forwardInvocation:(NSInvocation *)anInvocation
{
    NSString *argument;
    [anInvocation getArgument:&argument atIndex:2];
    if (argument) {
        NSString *setterName = NSStringFromSelector(anInvocation.selector);
        NSRange range = NSMakeRange(3, [setterName length]-4);
        NSString *propertyName = [[setterName substringWithRange:range] lowercaseString];
        [self performSelector:@selector(setFoo:value:) withObject:propertyName withObject:argument];
    } else {
        [self performSelector:@selector(foo:) withObject:argument];
    }
}

- (id)foo:(id)key
{
    return self.properties[key];
}

- (void)setFoo:(id)key value:(id)value
{
    self.properties[key] = value;
}

- (id)valueForKey:(NSString *)key
{
    return self.properties[key];
}

- (void)setValue:(id)value forKey:(NSString *)key
{
    self.properties[key] = value;
}

稍后,当我针对值类型等进行优化时,我将使用更清洁的版本进行更新。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

实现此效果的最简单方法?

来自分类Dev

在Groovy中实现单方法接口的最简单方法?

来自分类Dev

模拟最大CPU负载的最简单方法?

来自分类Dev

C#解析简单XML属性的最简单方法

来自分类Dev

模拟松散定义的Python dict对象的简单方法

来自分类Dev

实现响应式枚举的最简单方法是?爪哇

来自分类Dev

在Android中实现滑动叠加面板的最简单方法

来自分类Dev

在NetLogo中实现冲突的最简单方法

来自分类Dev

在Gremlin中实现行号的最简单方法

来自分类Dev

在Android中实现滑动叠加面板的最简单方法

来自分类Dev

在NetLogo中实现冲突的最简单方法

来自分类Dev

按属性对php数组进行排序的最简单方法

来自分类Dev

按属性对php数组进行排序的最简单方法

来自分类Dev

Tcpclinet C#发送对象的最简单方法

来自分类Dev

创建返回对象引用的成员函数的最简单方法

来自分类Dev

设置javascript对象多级属性的简单方法?

来自分类Dev

打字稿从内部对象获取属性的简单方法

来自分类Dev

EpiServer-模拟UrlResolver的简单方法

来自分类Dev

在C ++ 03中模拟最简单的方式来限制复制/分配操作的最简单方法是什么?

来自分类Dev

OCMock:模拟实现多个协议的对象?

来自分类Dev

在SwiftUI中制作动态,可编辑的简单对象列表的最简单方法?

来自分类Dev

实现Entity Framework 6 Add-or-Update方法的最简单方法是什么

来自分类Dev

在OS X上实现浮动按钮UI视图的最简单方法是什么

来自分类Dev

在mysql和php中实现价格计划的最简单方法是什么?

来自分类Dev

将Hazelcast JCache实现连接到JSR107批注的最简单方法

来自分类Dev

在iOS Swift 2中实现“更多信息”按钮以扩展UITextView的最简单方法?

来自分类Dev

实现路线以显示某些视图的最简单方法是什么?

来自分类Dev

在mysql和php中实现价格计划的最简单方法是什么?

来自分类Dev

在 Drupal 7 站点上实现临时页面的最简单方法

Related 相关文章

  1. 1

    实现此效果的最简单方法?

  2. 2

    在Groovy中实现单方法接口的最简单方法?

  3. 3

    模拟最大CPU负载的最简单方法?

  4. 4

    C#解析简单XML属性的最简单方法

  5. 5

    模拟松散定义的Python dict对象的简单方法

  6. 6

    实现响应式枚举的最简单方法是?爪哇

  7. 7

    在Android中实现滑动叠加面板的最简单方法

  8. 8

    在NetLogo中实现冲突的最简单方法

  9. 9

    在Gremlin中实现行号的最简单方法

  10. 10

    在Android中实现滑动叠加面板的最简单方法

  11. 11

    在NetLogo中实现冲突的最简单方法

  12. 12

    按属性对php数组进行排序的最简单方法

  13. 13

    按属性对php数组进行排序的最简单方法

  14. 14

    Tcpclinet C#发送对象的最简单方法

  15. 15

    创建返回对象引用的成员函数的最简单方法

  16. 16

    设置javascript对象多级属性的简单方法?

  17. 17

    打字稿从内部对象获取属性的简单方法

  18. 18

    EpiServer-模拟UrlResolver的简单方法

  19. 19

    在C ++ 03中模拟最简单的方式来限制复制/分配操作的最简单方法是什么?

  20. 20

    OCMock:模拟实现多个协议的对象?

  21. 21

    在SwiftUI中制作动态,可编辑的简单对象列表的最简单方法?

  22. 22

    实现Entity Framework 6 Add-or-Update方法的最简单方法是什么

  23. 23

    在OS X上实现浮动按钮UI视图的最简单方法是什么

  24. 24

    在mysql和php中实现价格计划的最简单方法是什么?

  25. 25

    将Hazelcast JCache实现连接到JSR107批注的最简单方法

  26. 26

    在iOS Swift 2中实现“更多信息”按钮以扩展UITextView的最简单方法?

  27. 27

    实现路线以显示某些视图的最简单方法是什么?

  28. 28

    在mysql和php中实现价格计划的最简单方法是什么?

  29. 29

    在 Drupal 7 站点上实现临时页面的最简单方法

热门标签

归档