代码之家  ›  专栏  ›  技术社区  ›  Dan Rosenstark

使用块缩短Objective-C代码

  •  2
  • Dan Rosenstark  · 技术社区  · 14 年前

    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 回复  |  直到 9 年前
        1
  •  1
  •   Georg Fritzsche    14 年前

    唯一的好处是没有为新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;
    

        2
  •  1
  •   Jonathan Grynspan    14 年前

    这种特殊的模式在其他情况下很有用(通常是在运行时需要扩展性的情况下),并且在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
    }