Video: Learning iOS: Create your own app with Objective-C! by Tianyu Liu 2024
En protokoll definerer sett med metoder som kan implementeres av hvilken som helst klasse for iOS-apper. Tenk på protokoller som å definere grensesnitt som klasser må implementere. Protokoller brukes ofte til å spesifisere grensesnittet for delegerte objekter. Med protokollfunksjonen kan du unngå å tvinge underklasse for å lage polymorfe klasser.
Mål-C (i motsetning til C ++) tillater ikke at en klasse har flere superklasser. Protokoller er derfor en viktig funksjon i Mål-C fordi det ikke tillater flere arv. Når en klasse implementerer metodene i en protokoll, er klassen siktet til samsvar til protokollen.
Definisjonen av en protokoll ligner definisjonen av et grensesnitt for en klasse. En protokoll har imidlertid ikke en forelderklasse eller instansvariabler. Her er et eksempel på en protokolldefinisjon (Printable) fra postfix kalkulatorprogrammet:
@protocol Printable - (void) printMe; // Jeg kan forlate @required, siden det er standard @optional - (NSString *) printMeToString; -d
Ved ankomst (og med stor fanfare) av Objective-C 2.0, kan protokollmetoder enten være påkrevd (standard) eller valgfritt. Så jeg kastet disse kompilatordirektiver inn i blandingen her også.
Her er erklæringen fra StackOfInteger om at den skal implementere protokollen:
@interface StackOfInteger: NSObject … -d
Her er implementeringen av protokollen i StackOfInteger-klassen:
@implementation StackOfInteger; … Andre StackOfInteger metoder … /////////// Metoder for å implementere Printable protokollen //////////// - (void) printMe {int k, stackCount = [element count]; NSLog (@ "Stack-> Last>% dlast); for (k = 0; k% @Du kan implementere printMeToString-metoden, men det er valgfritt.
Et program kan teste om en gjenstand samsvarer med en protokoll. Følgende kode inneholder eksempler på denne testen (hentet fra hovedprogrammet til prøven):
printf ("Testing conformance to protocolsn"), hvis ([myStack conformsToProtocol: @protocol (Utskriftsvennlig)]) {printf ("Using protocol methodsn"); [myStack printMe];} else {NSLog (@ "Object samsvarer ikke med protokollen% @ n", @protocol Utskriftsvennlig));} id someObject = [[PostfixCalculator allokering initWithExpression: @ "44 55 *"]; hvis (! [SomeObject conformsToProtocol: @protocol (Printable)]) {NSLog (@ "Objektet samsvarer ikke med protokollen");}Fordi myStack-objektet overholder protokollen, kalles metodene printMe og printMeToString.Siden someObject (som er type id for å gjøre eksemplet mer meningsfylt) ikke samsvarer med Utskriftsprotokollen, forsvinner testen for samsvar.
Du kan også teste for eksistensen av en valgfri metode ved hjelp av metoden respondsToSelector.
Du kan få en klasse til å vedta en protokoll bare ved å implementere metodene som er definert av protokollen. Det betyr at du ikke må erklære protokollen i grensesnittet. Selv om klassen implementerer protokollmetodene, vil det ikke ikke være i samsvar med protokollen og vil mislykkes den forrige konformitetsprøven.