昨天一位同事问,为什么我们不应该在协议中声明一个init方法(initWith ...:(...))来强制实现类来提供这样的初始化器。我对这个问题感到非常惊讶,根据我的理解,这是无稽之谈。但我找不到明确的理由,但在协议中声明init方法会导致实现的灵活性降低。
请您告诉我一个很好的理由,为什么协议中应该或不应该使用init方法?
谢谢!
答案 0 :(得分:7)
您可以在协议中定义方法,以便您的代码可以调用其他人实现的方法。您和实现协议的开发人员之间的“契约”如下所示:
为了调用协议的方法,您需要有一个实现它的对象的实例。定义协议的重点是从代码中删除有关实现协议的类的任何知识:如果你知道要获得哪个类,你可以跳过协议,直接编程到类。但是,如果您想要调用init
,则必须要知道该类,否则其他人必须向您传递alloc
对象,其中尚未调用init
。这两种方法都不是一个好主意 - 第一个是杀死协议的目的,第二个是强制你的调用者处理部分初始化的对象。
请注意,它不会阻止您在协议中使用非init
配置方法:如果必须使用某些信息配置所有对象,请让您的用户实现他们想要的任何init
,并在协议中添加configureWith:...
方法,让您可以控制配置对象的过程,而无需了解其init
方法。
答案 1 :(得分:4)
我知道iOS SDK中有一些具有init ...方法的协议。例如,NSCoding Protocol具有 - initWithCoder:required方法。我认为这是正常的做法。