비디오: Introducing SwiftUI: Building Your First App 2024
프로토콜은 모든 클래스에서 구현할 수있는 메서드 집합을 정의합니다. 프로토콜은 클래스가 구현해야하는 인터페이스를 정의하는 것으로 생각하십시오. 프로토콜은 종종 위임 객체의 인터페이스를 지정하는 데 사용됩니다.
프로토콜 기능을 사용하면 다형성 클래스를 생성하기 위해 서브 클래 싱을 강제하지 않아도됩니다. Objective-C (C ++과 달리)는 클래스가 여러 수퍼 클래스를 가질 수 없도록합니다. 프로토콜은 다중 상속을 허용하지 않기 때문에 Objective-C에서 필수적인 기능입니다.
클래스가 프로토콜에서 메소드를 구현할 때, 클래스는 프로토콜에 일치한다고합니다. 프로토콜의 정의는 클래스의 인터페이스 정의와 유사합니다. 그러나 프로토콜에는 상위 클래스 나 인스턴스 변수가 없습니다. 다음은 후위 계산기 계산기 프로그램의 프로토콜 정의 (Printable)의 예입니다:
@protocol Printable - (void) printMe; // 기본 @ 옵션이므로 @required를 생략 할 수 있습니다. - (NSString *) printMeToString; -d
Objective-C 2. 0의 도착 (실제로는 큰 팡파르)으로 인해 프로토콜 메소드가 필수 (기본값) 또는 선택적 일 수 있습니다.
다음은 StackOfInteger 클래스의 프로토콜의 구현입니다:
@implementation StackOfInteger; … StackOfInteger 다른 방법은 … /////////// 방법은 인쇄 프로토콜 //////////// 구현 - (무효) printMe {INT의 K를 stackCount = 요소 개수]; printMeToString 메서드는 선택 사항이므로 구현되지 않았습니다.
Last> % dlast) ! --1 -> 프로그램은 오브젝트 프로토콜에 부합하는지 여부를 테스트 할 다음 코드 (샘플의 메인 프로그램에서 촬영)이 시험의 예로 포함하는
의 printf ("테스트 적합성에있다. protocolsn "); ([myStack conformsToProtocol가: @protocol (인쇄)] 경우) {printf와 ("사용 프로토콜 methodsn은 "); [myStack printMe];} 다른 {NSLog은 (@"개체 프로토콜 %의 @ n을 준수하지 않는 " "NSLog (@"객체가 다음을 준수하지 않습니다: @protocol (Printable));} id someObject = [[PostfixCalculator alloc] initWithExpression: @ "44 55 *"]; 프로토콜 ").}는 myStack 오브젝트 프로토콜을 따르는 것이므로, printMe 및 printMeToString 메소드를 호출하는보다 의미 예 있도록 이드 타입 여기서 someObject ()는 인쇄 프로토콜에 부합하지 않기 때문에, 테스트 적합성 실패.
respondsToSelector 메소드를 사용하여 선택적 메소드의 존재 여부를 테스트 할 수도 있습니다.
클래스는 프로토콜에 정의 된 메소드를 구현함으로써 프로토콜을 채택 할 수 있습니다. 즉, 인터페이스에서 프로토콜을 선언 할 필요가 없습니다. 그러나, 클래스가 프로토콜 메소드를 구현하더라도, 프로토콜을 따르지 않고 (999), 선행 적합성 테스트를 실패 할 것이다.