7

次のオブジェクトがある場合:

@interface Simple : NSObject

@end

@interface Complex : Simple

@end

そして次のような別のオブジェクト:

@interface Test : NSObject 

+(void) doSomething:(void (^)(Simple*)) obj;

@end

次のようなメソッドを呼び出すと、すべてが機能します。

[Test doSomething:^(Simple * obj) {

}];

代わりに次のように呼ぼうとすると:

[Test doSomething:^(Complex * obj) {

}];

コンパイラは次のように述べています。

Incompatible block pointer types sending 'void (^)(Complex *__strong)' to parameter of type 'void (^)(Simple *__strong)'

Complexextendsを拡張するのでSimple、Javaのようにこれが機能すると思いました。

どういうわけかこれを達成する方法はありますか?

4

2 に答える 2

8

残念ながら、これは Blocks API の制限です。必要に応じて、型の安全性を完全に放棄して、ブロックを次のように宣言するオプションがあります。

+(void) doSomething:(void (^)(id)) obj;

これにより、ブロックの引数のクラスを設定できます。しかし、繰り返しになりますが、これはタイプに関して完全に安全ではありません。

于 2013-03-07T00:00:39.583 に答える
2

またはidの代わりに使用します。ブロックパラメータータイプは、メソッドパラメータータイプとは異なる方法で処理されます(@CodaFiに感謝)Complex *Simple *

于 2013-03-06T23:59:18.783 に答える