方法参数中的协议一致性是可选的吗?

时间:2017-11-22 21:52:24

标签: ios objective-c

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}}。

1 个答案:

答案 0 :(得分:1)

在Objective C和Swift方法中,通过名称调用(为了加快速度,如果没有冲突,只比较选择器名称的哈希)。参数类型的返回类型没有影响选择器名称。

这意味着如果从方法返回不同的类型,则在运行时不会出现问题,直到对返回的对象执行某些无效操作(例如,返回的视图不实现所需的协议,并且您已调用此方法)。

Clang会将此视为警告而不是错误,并且良好做法是修复此类警告。事实上,强烈建议在编译期间进行-Wall切换。

另请注意,协议不必由类明确实现。如果类具有所有匹配方法并且它将在运行时工作就足够了。