iOS >>协议和代表概念



有很多关于Protocols&网络上的学员和不同的教程用不同的名字称呼这个过程中的一些"参与者"。

特别令人困惑的是"适应者"one_answers"一致者"的概念。

我知道实现Protocol方法的类(即其中包含<ProtocolName>语句的类)是"Conforming to Protocol"。它也是议定书的"采用者"吗?

如何调用在中声明或在中重新声明协议的类,以便它可以包含必须符合协议的属性,即在其接口中具有@protocol ProtocolName语句?

我找不到任何苹果官方文档来解释这一点。

编辑

伙计们,谢谢你们给出的具体答案,但我确实(而且确实)理解这个模式以及它是如何在语言中实现的。我的问题过去(现在仍然)与NAMING有关。。。尽管如此,我还是找不到任何关于"声明/REDECLARES协议的类的名称(概念上)是什么"的引用。也许它没有名字,我应该把它叫做:"声明/重新声明协议的类"。也许我可以称之为"授权班"(顺便说一句,听起来不错)。。。

语义。我想说它的行动与结果。

通过采用协议(操作),您符合(结果)

协议

当谈到Objective-C时,协议是Objective-C语言的一个概念,因此编译器可以理解它。具体来说,可以通过@protocol关键字进行定义。

类可以声明自己符合使用角度语法的协议:

 @interface MyClass <MyProtocol> // class MyClass conforms to protocol MyProtocol

有些人在这里使用采用一词,如"类MyClass采用协议MyProtocol"。

Objective-C编译器将理解此语法,例如,如果MyProtocol中有未在MyClass中实现的必需方法,它可以警告您。

图案

(编程设计)模式是抽象概念,可以用任何(图灵完备)语言实现。您编写一个特定于语言的代码,然后将此模式告知人类。编译器将不知道是否将代码称为某个花哨的单词。

适配器是一种特定的模式。同样,它可以与任何编程语言一起使用,尽管有些语言(例如Python)通过声明使这更容易。

我不知道Conformer的概念。

代表

委派委托模式的一部分。它用于解决对象A想要对对象B做些什么,然后希望B能够与A对话的问题。为了使这种对话成为可能,B需要了解A的一些方法,但如果A是一个非常复杂的类,因此B可能会被迫知道"太多"。

委派模式通过显式声明协议DelegateOfB来解决这个问题,CCD_16是在定义B的地方定义的。然后任何需要从B接收信息的类(如A)都声明它符合DelegateOfB并实现相应的方法。因此CCD_ 21除了符合CCD_。

这个模式也可以用任何语言实现,但Cocoa/Cooa-Touch或大多数其他Objective-C框架都是不寻常的,因为每当出现上述问题时,90%的时间都会使用委派。

在这里,协议是一种语言功能是有帮助的。同样,这个模式理论上可以用于任何语言,甚至汇编程序:),但它对Objective-C更有用,因为你可以声明委托需要符合这个协议:

@property id<DelegateOfB> delegate;

如果编译器认为您分配了不符合DelegateOfB的内容,它就会警告您。

在其他语言中,通常使用不同的解决方案,例如回调函数。

请参阅文章。

使用(Objective-C中的@protocol语法)声明的协议用于声明"采用"(声明将使用此协议)的类将实现的一组方法。这意味着您可以在代码中指定,"只要实现了特定的协议,就不在乎使用哪个类"。这可以在Objective-C中完成,如下所示:

id<MyProtocol> instanceOfClassThatImplementsMyProtocol;

如果您在代码中声明了这一点,那么任何"符合"协议MyProtocol的类都可以在变量instanceOfClassThatImplementsMyProtocol中使用。这意味着使用这个变量的代码知道,无论它是什么类,它都可以使用MyProtocol中定义的任何方法来处理这个特定的变量。这是避免继承设计模式和避免紧密耦合的好方法。

委托是协议语言功能的一种使用。委托设计模式是设计代码以在必要时使用协议的一种方式。在Cocoa框架中,委托设计模式用于指定符合特定协议的类的实例。这个特定的协议指定了委托类应该实现的方法,以便在给定的事件中执行特定的操作。使用委托的类知道它的委托是协议的共同形式,所以它知道它可以在给定的时间调用实现的方法。这种设计模式是解耦类的一种很好的方式,因为它可以很容易地将一个委托实例交换为另一个——程序员所要做的就是确保替换实例或类符合必要的协议(即,它实现了协议中指定的方法)!

协议和委托不仅限于Objective-C和Mac/iOS开发,而且Objective-C语言和Apple框架大量使用了这种令人敬畏的语言功能和设计模式。

这里有一个例子。在Cocoa Touch的UIKit框架中,有一个UITextFieldDelegate协议。该协议定义了一系列方法,作为UITextField实例的委托的类应该实现这些方法。换句话说,如果要将委托分配给UITextField(使用委托属性),则最好确保此类符合UITextFieldDelegate。事实上,因为UITextField的委托属性被定义为:

@property(nonatomic, assign) id<UITextFieldDelegate> delegate

如果你给编译器分配了一个没有实现协议的类,编译器就会发出警告。这真的很有用。你必须声明一个类实现了一个协议,并且说它实现了,你是在让其他类知道他们可以以特定的方式与你的类交互。因此,如果将MyTextFieldDelegateClass的实例分配给UITextField中的delegate属性,则UITextField知道它可以调用MyTextFieldDeegateClass的一些特定方法(与文本输入、选择等相关)。它知道这一点,因为MyTextFieldDelegateClass已经说过它将实现UITextFieldDelicate协议。

最终,这一切都会使您的项目代码具有更大的灵活性和适应性,我相信您在使用这项技术后很快就会意识到这一点!享受:)

这里用Objective-C苹果文档编程,它简要介绍了您正在寻找的术语,如采用&符合等。

我不太确定你在问什么。但是,您可以强制使用您的协议的类实现某个方法。

@protocol theDelegate <NSObject>
@required
-(void)doSomething;
@end

相关内容

  • 没有找到相关文章

最新更新