4

これは学習用です =) 関数、メソッド、ブロックはすべて宣言してから呼び出すことができることを理解しています。ブロックをよりよく理解しようとしているだけです。

これが私がやりたいことの基本的な考え方です。

CGRectMake(100,^CGFloat(){return 1.0f;},100,100);

コンパイラはブロックの戻り値を認識しておらず、代わりにブロック自体をエラーになる値として認識しています。ブロックをキャストする方法をいくつか試しましたが、解決策を見つけることができませんでした。

これを行う方法はありますか?そうでない場合、戻り値を使用してインライン関数を実行する別の方法はありますか?

編集 Heres は、正解の最初の例に基づいて使用しているコード例です。

valueLabelMin.frame = CGRectMake(0,
                                 ^CGFloat(){
                                   if (CGRectGetMaxY(dateRangeStartLabel.frame)) {
                                     return CGRectGetMaxY(dateRangeStartLabel.frame)-20;
                                   }else{
                                     return self.bounds.size.height-20;
                                   }
                                 }(),
                                 50,
                                 20);

編集2これは元の質問の文脈から少し外れていますが、質問を読むときにいつも感謝している文脈での関連性を示しています.

このコード例は、条件に基づいて一部の UILabels のフレームを変更し、オプションでアニメーション化し、完了ブロックを実行します。

各ラベルの setFrame は 1 回だけ呼び出されるので、非常に扱いやすいコードになることに注意してください。

- (void)updateValueRangeLabels:(BOOL)animated completion:(void(^)(void))completion {

    void (^setLabelFrames)() = ^()
    {
        valueLabelMax.frame = CGRectMake(^CGFloat(){if(_showValueRange){return 0;}else{return -50;}}(),
                                         CGRectGetMaxY(titleLabel.frame),
                                         50, 20);

        valueLabelMid.frame = CGRectMake(^CGFloat(){if(_showValueRange){return 0;}else{return -50;}}(),
                                         CGRectGetMaxY(titleLabel.frame) + (self.bounds.size.height - CGRectGetMaxY(titleLabel.frame) - CGRectGetMinY(dateRangeStartLabel.frame) - 20)/2,
                                         50, 20);

        valueLabelMin.frame = CGRectMake(^CGFloat(){if(_showValueRange){return 0;}else{return -50;}}(),
                                         ^CGFloat(){if(_showDateRange){return CGRectGetMinY(dateRangeStartLabel.frame)-20;}else{return self.bounds.size.height - 20;}}(),
                                         50, 20);
    };

    if (animated) {
        [UIView animateWithDuration:0.3 animations:^{
            setLabelFrames();
        }completion:^(BOOL finished){
            completion();
        }];
    }else{
        setLabelFrames();
        completion();
    }
}

ブロックはすごい!

4

2 に答える 2

2

次のように評価します。

CGRect r = CGRectMake(100,^CGFloat(){return 1.0f;}(),100,100);
                                                  ^^

パラメータを導入する別の例:

// creates a CGRect with all values set to the parameter (12 in this example)
CGRect r = ^CGRect(CGFloat p){return (CGRect){p,p,p,p};}(12);
于 2013-05-24T09:13:40.023 に答える