2017-11-22 6 views
1

Objective-Cコンパイラは、メソッドパラメータが別のプロトコルで宣言される方法である場合、そのメソッドパラメータがプロトコルに準拠するように強制しませんか?メソッドパラメータのプロトコル適合はオプションですか?

@protocol FooProtocol<NSObject> 

-(UIView <BarProtocol>*)barView; 

@end 

@protocol BarProtocol<NSObject> 

-(BOOL)foobar; 

@end 

@interface FooController : NSObject<FooProtocol> 

@end 

@implementation FooController { 
    UIView *_view; 
} 

-(UIView *)barView { 
    return _view; 
} 

@end 

そして、コンパイラはFooControllerbarViewBarProtocolに準拠UIView *を返さないことに文句はありません:私は次のようになりますいくつかのコードを持っています。

+1

強いタイピングが必要な場合は、Swiftに移動します。 Objective-Cは本質的にCです。コンパイラが何が起きているのかを理解するのに役立つ装飾がいくつか追加されていますが、コンパイラはキャストを使用するとそのメソッドからNSStringを返すようにします。 – Paulw11

+1

_ "コンパイラは不平を言っていません" _これには警告があります。 –

答えて

1

Objective Cでは、Swiftメソッドは名前で呼び出されます(高速化のために、衝突がなければセレクタ名のハッシュのみが比較されます)。戻り値の型の引数型に影響を与えるセレクタ名はありません。

これは、メソッドから別の型を返す場合、返されたオブジェクトに対して無効な操作を行うまで、実行時には問題にならないことを意味します(返されたビューは必須のプロトコルを実装せず、方法)。

Clangはこれを警告として検出し、エラーではなく、そのような警告を修正することをお勧めします。コンパイル時に実際には-Wallスイッチを使用することを強くお勧めします。

プロトコルが明示的にクラスによって実装される必要はないことにも注意してください。クラスにすべての一致するメソッドがあり、それが実行時に機能すれば十分です。

関連する問題