Video: Learning iOS: Create your own app with Objective-C! by Tianyu Liu 2024
En protokoll klargjør per definisjon sett med metoder som kan implementeres av hvilken som helst klasse for en iOS-app. Protokoller brukes til å definere grensesnitt som implementeres av klasser. 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. Legg merke til at kompilatordirektiver er her også.
@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% @
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 samsvarer med 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.