这是我用来修改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;
}
答案可能是块不适合这种简短的方法或其他东西。语法确实看起来很时髦。
答案 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
}