0

過去に書いたコードをモダナイズして新しいアプリケーションを設計しています。この古いコードはクラス/デリゲート モデルを使用しており、デリゲートのものではなくブロックをコールバックとして使用するように変換しようとしています。

私がしていることは、次のようなプロパティを作成することです

@property (nonatomic, copy) void (^onTouch)(NSInteger index);

これにより、そのクラスを使用するオブジェクトに、コードを挿入できるブロックが渡され、この場合はタッチで実行されます。

しかし、私の問題はこれです。デリゲートを使用し、デリゲート プロトコルにメソッドがある場合、そのクラスを使用してデリゲート プロトコルの実装を忘れると、Xcode は警告を発します。それはブロックでそれを行う方法ですか?言い換えれば、コールバック ブロックが呼び出し元によって定義されていない場合、Xcode に文句を言う方法はありますか?

私はこれが正しいことを意味します:

MyClass *obj = [[MyClass alloc] init];
obj.onTouch = ^(NSInteger *index){ //call back code to be executed };

これでもいいでしょう

MyClass *obj = [[MyClass alloc] init];
obj.onTouch = nil;

しかし、これはメッセージを生成します

MyClass *obj = [[MyClass alloc] init];
// no callback block defined.

これは可能ですか?

4

2 に答える 2

2

特定のパラメーターの設定を強制したい場合は、それを初期化子に含めます。

MyClass *obj = [[MyClass alloc] initWithBlock:^(NSInteger *index) { /* code*/ }];

次に、でMyClass

- (id)init {
  // This will result in a runtime error if you use the wrong initializer.
  NSAssert(NO, @"Use initWithBlock instead.");
}

- (id)initWithBlock(initWithBlock:^(NSInteger *)block) {
  self = [super init];
  if (self) {
    self.onTouch = block;
  }
  return self;
}

また、ブロックを実行しようとするとNULLクラッシュすることにも注意してください。

if (self.onTouch) { self.onTouch(); }

ブロックを実行する場所はどこでも。

于 2013-09-22T17:03:06.200 に答える