Video: iOS Swift Basics Tutorial: Protocols and Delegates 2024
Per definitie verduidelijkt een protocol reeksen methoden die door elke klasse voor een iOS-app kunnen worden geïmplementeerd. Protocollen worden gebruikt om interfaces te definiëren die door klassen worden geïmplementeerd. Protocollen worden vaak gebruikt om de interface voor gemachtigde objecten te specificeren. Met de protocolfunctie kunt u voorkomen dat subklassen moet worden geforceerd om polymorfe klassen te maken.
Objective-C (in tegenstelling tot C ++) staat niet toe dat een klasse meerdere superklassen heeft. Protocollen zijn daarom een essentieel kenmerk in Objective-C, omdat er geen sprake is van meerdere overerving.
Wanneer een klasse de methoden implementeert in een protocol, wordt gezegd dat de klasse conform is voor het protocol.
De definitie van een protocol lijkt op de definitie van een interface voor een klasse. Een protocol heeft echter geen bovenliggende klasse- of instantievariabelen. Hier is een voorbeeld van een protocoldefinitie (afdrukbaar) van het postfix-rekenmachineprogramma:
@protocol afdrukbaar - (ongeldig) printMe; // Ik kan @required weglaten, omdat dit de standaard @optional - (NSString *) printMeToString is; -d Met de komst (en inderdaad met veel tamtam) van Objective-C 2. 0 kunnen protocolmethoden vereist zijn (standaard) of optioneel. Merk op dat de compilerrichtlijnen hier ook zijn.
@interface StackOfInteger: NSObject … -d
Dit is de implementatie van het protocol in de klasse StackOfInteger:
@ implementatie StackOfInteger; … Andere StackOfInteger-methoden … /////////// Methoden voor het implementeren van het afdrukbare protocol //////////// - (void) printMe {int k, stackCount = [aantal elementen]; NSLog (@ "Stack-> Last>% dlast); for (k = 0; k% @
Merk op dat de methode printMeToString niet is geïmplementeerd omdat deze optioneel is.
< ! --1 -> Een programma kan testen of een object voldoet aan een protocol De volgende code bevat voorbeelden van deze test (uit het hoofdprogramma van het monster): printf ("Testen conformiteit met protocolsn "); if ([myStack conformToProtocol: @protocol (Printable)]) {printf (" Using protocol methodsn "); [myStack printMe];} else {NSLog (@" Object voldoet niet aan protocol% @ n ", @protocol (afdrukbaar));} id someObject = [[PostfixCalculator alloc] initWithExpression: @ "44 55 *"]; if (! [someObject conformToProtocol: @protocol (Printable)]) {NSLog (@ "Object voldoet niet aan protocol ");}
Omdat het myStack-object overeenkomt met het protocol, worden de methoden printMe en printMeToString aangeroepen.Aangezien someObject (wat type-id is om het voorbeeld zinvoller te maken) niet conform is aan het afdrukbare protocol, mislukt de conformiteitstest.
Je kunt ook testen of er een optionele methode bestaat met de methode respondsToSelector. U kunt van een klasse een protocol maken door eenvoudig de methoden te implementeren die door dat protocol zijn gedefinieerd. Dat wil zeggen, u hoeft het protocol niet in zijn interface aan te geven. Hoewel de klasse de protocollen implementeert, zal
niet zich conformeren aan het protocol en zal de vorige conformantietest mislukken.