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
并且编译器不会抱怨barView
中的FooController
没有返回符合UIView *
的{{1}}。
答案 0 :(得分:1)
在Objective C和Swift方法中,通过名称调用(为了加快速度,如果没有冲突,只比较选择器名称的哈希)。参数类型的返回类型没有影响选择器名称。
这意味着如果从方法返回不同的类型,则在运行时不会出现问题,直到对返回的对象执行某些无效操作(例如,返回的视图不实现所需的协议,并且您已调用此方法)。
Clang会将此视为警告而不是错误,并且良好做法是修复此类警告。事实上,强烈建议在编译期间进行-Wall
切换。
另请注意,协议不必由类明确实现。如果类具有所有匹配方法并且它将在运行时工作就足够了。