프로토콜과 델리게이트의 차이점은 무엇입니까?
a protocol
와 a 의 차이점은 무엇입니까 delegate
?
과,
우리는 어떻게 선언 할 수 variables
A의 protocol class
?
( @protocol
Objective-C의 구문)로 선언 된 프로토콜 은 클래스 "적용"(이 프로토콜을 사용한다고 선언)이 구현할 메서드 집합을 선언하는 데 사용됩니다. 즉, "특정 프로토콜을 구현하는 한 어떤 클래스가 사용되는지는 신경 쓰지 않습니다"라는 코드를 지정할 수 있습니다. Objective-C에서 다음과 같이 수행 할 수 있습니다.
id<MyProtocol> instanceOfClassThatImplementsMyProtocol;
이를 코드에 명시하면 MyProtocol 프로토콜을 "준수"하는 모든 클래스를 instanceOfClassThatImplementsMyProtocol 변수에서 사용할 수 있습니다 . 즉,이 변수를 사용하는 코드는 클래스에 관계없이이 특정 변수와 함께 MyProtocol에 정의 된 모든 메서드를 사용할 수 있음을 알고 있습니다 . 이것은 상속 디자인 패턴을 피하고 긴밀한 결합을 피하는 좋은 방법입니다.
델리게이트는 프로토콜의 언어 기능을 사용합니다. 위임 디자인 패턴필요한 곳에 프로토콜을 사용하도록 코드를 디자인하는 방법입니다. Cocoa 프레임 워크에서 위임 디자인 패턴은 특정 프로토콜을 준수하는 클래스의 인스턴스를 지정하는 데 사용됩니다. 이 특정 프로토콜은 지정된 이벤트에서 특정 작업을 수행하기 위해 위임 클래스가 구현해야하는 메서드를 지정합니다. 델리게이트를 사용하는 클래스는 델리게이트가 프로토콜에 coform한다는 것을 알고 있으므로 주어진 시간에 구현 된 메서드를 호출 할 수 있음을 알고 있습니다. 이 디자인 패턴은 하나의 델리게이트 인스턴스를 다른 델리게이트 인스턴스로 쉽게 교환 할 수 있기 때문에 클래스를 분리하는 훌륭한 방법입니다. 프로그래머는 대체 인스턴스 또는 클래스가 필요한 프로토콜을 준수하는지 확인하기 만하면됩니다 (즉, 프로토콜에 지정된 방법)!
프로토콜과 델리게이트는 Objective-C 및 Mac / iOS 개발에만 국한되지 않고 Objective-C 언어와 Apple 프레임 워크는이 멋진 언어 기능과 디자인 패턴을 많이 사용합니다.
편집하다:
여기에 예가 있습니다. Cocoa Touch의 UIKit 프레임 워크에는 UITextFieldDelegate 프로토콜이 있습니다. 이 프로토콜은 UITextField 인스턴스의 대리자 인 클래스 가 구현해야하는 일련의 메서드를 정의합니다 . 즉, 속성을 사용하여 UITextField에 대리자를 할당하려는 delegate
경우이 클래스가 UITextFieldDelegate를 준수하는지 확인하는 것이 좋습니다 . 실제로 UITextField 의 delegate 속성 은 다음과 같이 정의되기 때문입니다.
@property(nonatomic, weak) id<UITextFieldDelegate> delegate
그런 다음 컴파일러는 프로토콜을 구현하지 않는 클래스를 할당하면 경고를 표시합니다. 이것은 정말 유용합니다. 클래스가 프로토콜을 구현한다고 말해야하며, 그렇게한다고 말하면 다른 클래스에게 자신의 클래스와 특정 방식으로 상호 작용할 수 있음을 알려야합니다. 당신의 인스턴스에 할당한다면, MyTextFieldDelegateClass을 받는 사람 delegate
의 재산 의 UITextField 의 의 UITextField는 알고 그것은 당신의 (텍스트 입력, 선택 등 관련) 어떤 특별한 방법을 호출 할 수 MyTextFieldDelegateClass을 . MyTextFieldDelegateClass 가 UITextFieldDelegate 프로토콜 을 구현할 것이라고 말했기 때문에 이것을 알고 있습니다.
궁극적으로이 모든 것이 프로젝트 코드에 훨씬 더 큰 유연성과 적응성을 제공합니다.이 기술을 사용한 후에 곧 알게 될 것입니다! :)
프로토콜은 해당 프로토콜을 준수하는 클래스에 의해 구현되는 일련의 메소드 (선택적 또는 필수)입니다. 반면, delegate는 해당 프로토콜을 준수하고 프로토콜에 정의 된 메소드를 구현하는 클래스에 대한 참조입니다.
자세한 내용 은 이 Apple 문서 를 참조하십시오.
위임 : 다른 개체를 대신하여 작업 (디자인 패턴이 죄송합니다)
대리자라고하는 개체가 다른 개체를 대신하여 그리고 다른 개체의 요청에 따라 작동 하는 디자인 패턴 입니다. 실행 중 어느 시점에서 대리자에게 메시지를 보냅니다. 메시지는 델리게이트에게 어떤 이벤트가 일어나려고하고 어떤 응답을 요청합니다. 델리게이트는 메시지에 의해 호출 된 메서드를 구현하고 적절한 값을 반환합니다.
예를 들어 appdelegate 개체가 appobject를 대신하여 작동합니다.
프로토콜 : 상속으로 관련되지 않은 개체 간의 통신 활성화
프로토콜은 모든 클래스가 구현할 수있는 메소드를 가진 프로그래밍 인터페이스의 선언입니다. 프로토콜은 객관적인 C 언어 기능 입니다. 모든 클래스가 구현할 수있는 메소드 목록을 간단히 말하면이를 사용하려면 프로토콜을 확인해야합니다. 예를 들어 UITableviewDatasource 프로토콜은 프로토콜에 cellforRowAtIndexPath 메서드가 선언되어 있지만 tableview를 생성하기 위해 구현합니다.
https://developer.apple.com/library/mac/referencelibrary/GettingStarted/RoadMapOSX/books/StreamlineYourAppswithDesignPatterns/StreamlineYourApps/StreamlineYourApps.html을 참조 하십시오.
내가 mportant의 P는 rerequisite 이해 프로토콜입니다 f를 IRST 다음 위임한다. 이 짧은 자습서 를 먼저 본 다음 프로토콜이란 무엇입니까? 를 참조하십시오 . . 또한 클래스와 프로토콜의 차이점을 알아야합니다. Objective-C : 클래스 대 프로토콜 및 프로토콜 의 요점은 무엇입니까? .
protocol:
구현할 기능의 청사진 일뿐입니다. 해당 블루 프린트를 채택하는 모든 클래스는 해당 기능 을 구현 해야 합니다. ( 함수를 호출 하여 함수를 구현 하는 것을 실수하지 마십시오 )
delegate:
1 당신도 할 것입니다 할 delegat- 무엇을 보내고 클래스가하고있는 없이 상속 예
예를 들어, viewController가 있고 이미지를 다운로드하고 싶거나 고객과 매장까지의 거리를 확인하고 싶으므로 모든 작업을 직접 수행하는 대신 중간 객체 만 있으면됩니다. 이 개체를 대리자 개체라고합니다. 일반적으로 다음과 같은 작업을 수행합니다.
class ViewController : UIViewController , DownloaderDelegate{
//other code
// inside viewDidLoad or elsewhere you write:
downloaderHandler.delegate = self // now self can also use whatever the delegating object gives it...previously it was only a viewController but now it's 'almost' also a downloader
tableViewDelegate를 준수하기 위해 수행하는 작업과 매우 유사합니다.
class ViewController : UIViewController , UITableViewDelegate{
//other code
// inside viewDidLoad or elsewhere you write
tableView.delegate = self
당신의 self
캔은 이제있는 tableView에게 관련 물건을한다.
delegate:
2 But that object (the delegate) is a plain vanilla object (id or Any). It's dumb! You have to tell it: "Hey for you to work to have specific functionalities you need to conform to the protocol we defined for you. (we aren't going to extend Any or id as that would stupid, (instead) we made a very explicit confined protocol "
in Objective-C it's a pure vanilla id
, so you do
@property (weak) id<DownloaderProtocol>delegate;
in Swift* it's slightly easier you do :
weak var delegate:DownloaderProtocol?
Protocol comes to rescue...the delegate implements (not use) the function to however it suits the needs of your delegating class.
*: In Swift you don't have id
still you don't need its equivalent Any
because in Swift protocols are also a first class citizen type
Let see the declaration of delegate in program
id<myProtocol> *delegatingObject;
The delegatingObject keeps a reference to the other object and at the appropriate time sends a message to that object.
A protocol is a group of related properties and methods that can be implemented by any class.
It implies that any object (id type) that confirms myProtocol (group of related properties and methods) can work as a delegate or you can say any person (id) who has a required degree (protocol) can work as a Teacher (Delegate).
We can say Protocol as a set of rules. That rules can be optional or required like we have to use in protocol.
Delegates is a message passing technique in objective C and swift. An object has to take care of that message.
Ex: A simple example that every iOS developer used to is UITableview, While creating a table you must Implement cellForRowAtIndexPath()
and numberOfRowsInSection()
in your controller, that rules(protocol) are define in UItableview class as required, this is a requires Protocol.
There are other protocol like heightForRowAtIndexPath()
which is optional.
Now comes to Delegate in UITableView there is a method(message) didSelectRowAtIndexPath()
which sends you a message of an event.If you set the delegate to self it means that your controller is ready to take care of that event.
This terms seems to be more confusing for the developers because we are habitual to used it together(:
Enjoy!!!!
ReferenceURL : https://stackoverflow.com/questions/5431413/difference-between-protocol-and-delegates
'IT Share you' 카테고리의 다른 글
Visual Studio 빌드 전 이벤트 명령 줄에서 파일을 삭제하는 방법 (0) | 2021.01.06 |
---|---|
Python의 좋은 습관 또는 나쁜 습관 : 파일 중간에 가져 오기 (0) | 2021.01.06 |
양식에서 Enter 키를 누를 때 실행할 기본 동작 (0) | 2021.01.06 |
내부 콘텐츠가 있어도 Div가 확장되지 않음 (0) | 2021.01.06 |
S3 : 공용 폴더를 다시 비공개로 만드시겠습니까? (0) | 2021.01.06 |