我在“Objective C 编程”中的一个示例中有一个名为 AddressCard 的类,并且我正在实现一个 isEqual: 方法。
NSObject 中此方法的签名使用松散类型的参数:
- (BOOL)isEqual:(id)anObject
OTOH,书中的示例代码使用严格类型:
- (BOOL) isEqual:(AddressCard *) aCard
我不确定我是否完全理解编译器在这种情况下的作用。我尝试将 AddressCard 与 NSString ( [aCard isEqual: @"Foo"]
) 进行比较,期望出现运行时错误(如果系统使用我的方法)或系统将调用 NSObject 的 IsEqual 版本。
相反,我的方法被调用(即使参数是 NSString 而不是 AddressCard)并在我的 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 传递给期望其他方法的方法?覆盖时更改方法的签名可以吗?