【问题标题】:Class that conforms to a protocol - compile time check符合协议的类 - 编译时检查
【发布时间】:2013-05-08 07:21:49
【问题描述】:

这是有效的语法吗?

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

SomeProtocol 定义为:

@protocol SomeProtocol <NSObject>

@required
+ (BOOL)isAllowed;

@end

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

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

【问题讨论】:

  • @property (nonatomic, strong) id&lt;SomeProtocol&gt; myClass; 这是有效且经常使用的
  • 问题更多的是关于 Class 而不是 id

标签: ios objective-c protocols


【解决方案1】:

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

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

【讨论】:

  • 谢谢!有没有办法强制执行这样的编译时检查?
  • @pshah:我不这么认为。核心问题是任何返回类的方法或函数都将返回类型Class,类型检查器认为该类型与任何其他Class 兼容。对于返回 id 的方法也是如此——你不能对它们强制执行静态类型约束,因为 idClass 的意思是“直到运行时才知道实际类型。”
猜你喜欢
  • 2022-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-07
  • 1970-01-01
相关资源
最近更新 更多