使用块缩短我的Objective-C代码

时间:2010-07-17 16:52:48

标签: objective-c lambda

这是我用来修改UIView的类别。代码工作,但在第一个方法(setFrameHeight)我使用一个块,在第二个方法(setFrameWidth)我不是。在这个例子中,有没有办法更有效地使用块?

typedef CGRect (^modifyFrameBlock)(CGRect);

- (void) modifyFrame:(modifyFrameBlock) block {
    self.frame = block(self.frame);
}

- (void) setFrameWidth:(CGFloat)newWidth {
    modifyFrameBlock b = ^CGRect (CGRect frame) { 
        frame.size.width = newWidth;
        return frame; 
    };      
    [self modifyFrame:b];
}

- (void) setFrameHeight:(CGFloat)newHeight {
    CGRect f = self.frame;
    f.size.height = newHeight;
    self.frame = f;
}

答案可能是块不适合这种简短的方法或其他东西。语法确实看起来很时髦。

2 个答案:

答案 0 :(得分:1)

你唯一获得的不是为新的rect声明局部变量,作为交换,你需要定义一个块。这不是一件好事,特别是因为它分散了你正在做的事情。

请注意,您的块使用可能会缩短一点:

[self modifyFrame:^(CGRect frame) {
    frame.size.width = newWidth;
    return frame; 
}];

甚至:

[self modifyFrame:^(CGRect* frame) {
    frame->size.width = newWidth;
}];

modifyFrame:为:

CGRect frame;
block(&frame);
self.frame = frame;

但是我仍然会将这些方法局限于更复杂的方法,这些方法只需要代码的一小部分不同。

答案 1 :(得分:1)

这种特殊模式在其他情况下很有用(通常在运行时需要可扩展性),并且经常在C中看到函数指针代替块(例如qsort()bsearch()。)但是,通常的方法是从更简单的方法调用更复杂的方法:

- (void)setDisplaysUserInterface: (BOOL)flag {
    [self setDisplaysUserInterface: flag animated: YES];
}


- (void)setDisplaysUserInterface: (BOOL)flag animated: (BOOL)animated {
    [self setDisplaysUserInterface: flag animated: animated hideAfterDelay: NAN];
}

- (void)setDisplaysUserInterface: (BOOL)flag animated: (BOOL)animated hideAfterDelay: (NSTimeInterval)hideDelay {
    // and so forth
}