Video: Learning iOS: Create your own app with Objective-C! by Tianyu Liu 2024
En protokoll definerer sett med metoder som kan implementeres av enhver klasse. 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, sies klassen i samsvar med 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.
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% @
Legg merke til at printMeToString-metoden ikke er implementert fordi den er valgfri.
< ! - 1 -> 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 (Printable)]) {printf (" Bruk protokoll 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 er ikke i samsvar med protokoll ");}
Fordi myStack-objektet er i samsvar med protokollen, kalles metodene printMe og printMeToString. Siden someObject (som er type-ID for å gjøre eksemplet mer meningsfullt) ikke samsvarer med Utskriftsprotokollen, testen for samsvar mislykkes.
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 den
ikke ikke være i samsvar med protokollen og vil mislykkes i den foregående konformitetsprøven.