Objective-C的。使用块来减少代码量?

时间:2012-03-23 08:56:47

标签: objective-c delegates protocols block codeblocks

例如,我需要实现一个移动的对象。它是左,右,上,下方法。

被修改

以下代码不正确,但我希望它能解释我需要更好的东西:

@interface A : NSObject
...
@end

@implementation A
-(void)up
{
  [self moveTo:^{/*block1*/}];
}

-(void)down
{
    [self moveTo:^{/*block2*/}];
}

-(void)left
{
  [self moveTo:^{/*block3*/}];
}

-(void)right
{
  [self moveTo:^{/*block4*/}];
}

-(void)moveTo:(CodeBlock *)b {
  //actions before
 ...
  b
  //actions after
 ...
}
@end

4 个答案:

答案 0 :(得分:2)

你的问题有点不清楚,但是从Java代码片段来看,你想要在多个类上调用一个方法。这在Obj-C中非常简单,因为它是一种动态语言。您可以简单地将对象转换为类型id并在其上调用任何方法,只要该对象实现了该方法。

为了更正式地执行此操作,您需要定义协议:

@protocol Drawable <NSObject>
- (void)draw;
@end

然后,任何需要实现此协议的类都可以在标头中声明它:

@interface A : NSObject <Drawable>

然后简单地在A类中实现该方法.C类中的方法签名将变为:

- (void)show:(id<Drawable>)r
{
    [r draw];
}

另一个简单的解决方案是使用类层次结构,超类实现-(void)draw方法,并且需要不同实现的每个子类都可以覆盖它。

答案 1 :(得分:1)

解决方案

我的例子:

-(void)left
{
    [self moveTo:^(CGPoint p) {
        p.x--;
        return p;
    }];
}

-(void)moveTo:(CGPoint(^)(CGPoint))block
{
    CGPoint p = sprite.position;
    p = block(p);
    sprite.position = p;
}

右,上下方法与左方法类似。所以不要告诉我这是不正确的问题或解决方案是不可能的

答案 2 :(得分:0)

不确定我是否理解你的意思但你在目标C中使用setter和getters来修改你的变量。因此,在实例对象的实现中,您可以编写直接影响ivars的代码。

我认为您将位置定义为属性,这就是您说不能分配它的原因。

@property (nonatomic) CGPoint position;

但是在实施中如果设置了:

@synthesize position = _position;

然后你可以像这样直接修改它

_position.x++;

这意味着您可以编写类似

的方法
-(void) moveLeftBy:(int) x
{
    _position.x += x;
} 

如果这不是您的意思,请在您的问题中更明确。

答案 3 :(得分:0)

您可以通过检查参数来编写一个处理差异的组合方法:

(void)methodNameCombined:(NSInteger)direction
{
    ...
    switch(direction) {
        case 1:
            x++;
            break;
        case 2:
            y++;
            break;
    }
    ...
}

并从您的特定方法中调用此方法

(void)methodNameUp
{
    [self methodNameCombined:1]
}

(void)methodNameRight
{
    [self methodNameCombined:2]
}
...