2

这是有效的语法吗?

@property (nonatomic, strong) Class<SomeProtocol> myClass;

SomeProtocol定义为:

@protocol SomeProtocol <NSObject>

@required
+ (BOOL)isAllowed;

@end

我想强制执行编译时检查,以便编译器在将UIViewController未实现所需方法的类(例如)isAllowed用于myClass属性时进行抱怨。

PS 当我传入一个不符合 SomeProtocol 协议的类时,我没有收到编译器警告或错误。

4

1 回答 1

4

它在语法上是有效的,但是正如您所发现的,它只会检查您发送对象的消息,如果传入了不合格的类,则不会警告您。原因是所有类的静态类型都是 just Class,它是动态类型† — 就像您可以将 a 分配给id任何对象类型的变量一样,您也可以将 a 分配Class给任何Class变量。

† 注意:为了清楚起见,这不是术语“动态类型”的技术用途。我不知道是否有什么idClass是的正常短语。我认为它在上下文中应该很清楚,但我用它来指代它告诉编译器您不想为对象声明静态类型的事实,因此类型是动态的,就像在 Ruby 或 Python 中一样。

于 2013-05-08T07:28:52.177 回答