「ObjectiveCでのプログラミング」の例からAddressCardというクラスがあり、isEqual:メソッドを実装しています。
NSObjectのこのメソッドのシグネチャは、パラメータに緩い型を使用します。
- (BOOL)isEqual:(id)anObject
OTOH、本のサンプルコードは厳密な型付けを使用しています。
- (BOOL) isEqual:(AddressCard *) aCard
この場合、コンパイラが何をするのか完全には理解できません。[aCard isEqual: @"Foo"]
ランタイムエラー(システムが私のメソッドを使用している場合)またはシステムがNSObjectのバージョンのIsEqualを呼び出すことを期待して、AddressCardをNSString()と比較してみました。
代わりに、私のメソッドが呼び出され(パラメーターがアドレスカードではなくNSStringであったとしても)、IsEqual:がAddressCardに固有のメソッドを呼び出そうとしたときに例外が発生しました。
- (BOOL) isEqual:(AddressCard *) aCard {
if ([name isEqualToString: [aCard name]] && /*here I get the error*/
[email isEqualToString:[aCard email]]) {
return YES;
}else {
return NO;
}
}
どうしたの?NSStringは、他の何かを期待するメソッドにどのように渡されますか?メソッドをオーバーライドするときに、メソッドのシグネチャを変更しても大丈夫ですか?