Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/105.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 为什么我真的需要使用协议_Objective C_Ios - Fatal编程技术网

Objective c 为什么我真的需要使用协议

Objective c 为什么我真的需要使用协议,objective-c,ios,Objective C,Ios,可能重复: 我刚开始学习目标C,我似乎没有很好地理解协议。我对objective-C中的协议的理解是,您指定了一些方法定义,而没有实际为其编写代码。这意味着,无论谁决定继承我的类,都必须实现我所需的所有方法 我在这里的问题是,协议不是创造了一个额外的头,这不是真的需要。如果我在新类中需要一个方法,我可以直接实现它。为什么我需要从协议继承 为什么我不能忽略使用协议,而只是根据需要创建方法。除此之外,协议是一种让编译器帮助您避免常见错误的方法。在这种情况下,您可以指定一个类将调用另一个类(通常是

可能重复:

我刚开始学习目标C,我似乎没有很好地理解协议。我对objective-C中的协议的理解是,您指定了一些方法定义,而没有实际为其编写代码。这意味着,无论谁决定继承我的类,都必须实现我所需的所有方法

我在这里的问题是,协议不是创造了一个额外的头,这不是真的需要。如果我在新类中需要一个方法,我可以直接实现它。为什么我需要从协议继承


为什么我不能忽略使用协议,而只是根据需要创建方法。

除此之外,协议是一种让编译器帮助您避免常见错误的方法。在这种情况下,您可以指定一个类将调用另一个类(通常是委托)上的特定方法。然后编译器将进行检查,以确保另一个类(委托)实际实现了这些方法,如果没有,则会给您一条警告消息。由于未定义选择器(方法),在编译时获取消息比在运行时崩溃更可取

我在这里的问题是,协议不是创造了一个额外的头,这不是真的需要

没有额外的开销

如果我在新类中需要一个方法,我可以直接实现它。为什么我需要从协议继承

当然,您可以为您的通用实现声明一个子类,如果这是满足您需求的理想路径的话。如果您尝试这样做,您可能会遇到我在下面概述的问题

协议经常被使用,因为它们不是实际的物理类型。它是方法和/或其他协议的接口。通常,它们都是小的和专门的。由于objc不提供多重继承,因此协议对于短扩展非常方便


看看那些复杂的子类和继承一个或多个协议的类型;以
NSString
为例。知道Objc使用单个继承,考虑如何从所有这些协议中实现这个类并“继承”——然后考虑在为所有基础类型实现此类型之后传递这些类型时对客户端的影响。类层次结构和接口变得非常混乱。许多类中的变体数量将爆炸式增长,以容纳所有这些类型作为参数。大多数人会在这一点之前停下来,然后放弃类型安全性——这也是一个非常糟糕的主意。通过协议,您可以在一个简单的语言功能中实现“实现此接口”和类型安全(多重继承很快就会变得很难看)。

可能的重复,«决定继承我的类的人必须实现我所需的所有方法。»否。子类将继承其超类的协议方法实现,就像继承任何其他方法一样。协议只是方法的分组声明。