这是有效的语法吗?
@property (nonatomic, strong) Class<SomeProtocol> myClass;
SomeProtocol
定义为:
@protocol SomeProtocol <NSObject>
@required
+ (BOOL)isAllowed;
@end
我想强制执行编译时检查,以便当一个没有实现所需UIViewController
方法的类(例如isAllowed
)用于myClass
属性时,编译器会抱怨
P.S。当我传入一个不符合SomeProtocol协议的类时,我没有收到编译器警告或错误。
答案 0 :(得分:4)
它在语法上是有效的,但正如您所发现的,它只会检查您发送对象的消息,而不是在传入不合格的类时警告您。原因是所有类的静态类型是只是Class
,这是一种动态类型† - 就像您可以将id
分配给任何对象类型的变量一样,您可以为任何Class
变量分配Class
†注意:为了清楚起见,这不是术语“动态类型”的技术用途。&#34;我不知道id
和Class
是否有正常的短语。我认为它应该在上下文中非常清楚,但是我用它来指代它告诉编译器你不想为对象声明一个静态类型的事实,所以键入是动态的,如Ruby或蟒。