swift

Protocol definisce un tracciato per un metodo, una proprietà, o costituisce dei requisiti o funzionalità. Il protocol può essere adottato da classi, strutture o enumerazioni per fornire l'implementazione dei requisiti o delle funzionalità. Tali classi, strutture o enumerazioni quando adottano uno o più protocol devono soddisfarne i requisiti e diventano conformi al protocol.

In altre parole protocol contiene le linee guida a cui classi e strutture si devono attenere. 

Protocol può definire metodi e proprietà, non si interessa della loro implementazione, ne stabilisce solo i limiti specificandone il tipo e se deve garantire la sola lettura o la lettura e la scrittura (get/set). Un protocollo con la sola lettura imposta è più permissivo rispetto ad un protocollo in cui vengono pretese le definizioni sia dei metodi di lettura che quelli di scrittura.

Se, ad esempio, tramite protocol si specifica che una proprietà è di tipo get e set si pone un vincolo a quello che l'implementazione della proprietà può essere, infatti bisogna escludere che sia una costante o una proprietà calcolata (computed property) in quanto sono due tipi di proprietà in sola lettura.

protocol ProtocolloEsempio {

    var deveEssereImpostata: Int { get set }

    var nonNecessitaDiEssereImpostata: Int { get }

}

 

Vediamo un esempio di protocollo e il suo utilizzo:

//Definizione protocollo

protocol NomeCompleto {

    var nomeCompleto: String { get }

}

 

//Tipo conforme al protocollo

struct Persona: NomeCompleto {

    var nomeCompleto: String

}

 

La cosa importante da capire è che affinchè la struttura Persona sia conforme al protocollo NomeCompleto deve garantire l'implementazione della proprietà nomeCompleto. Torno a ribadire: protocol è un vincolo, un'impostazione, a cui il tipo conforme a protocol si deve attenere. Ricorda sicuramente i vincoli che una classe figlia ha nei confronti di una classe genitore, ma è molto più versatile in quanto non si parla di ereditarietà per i tipi conformi al protocol

Abbiamo visto l'uso di protocol per vincolare la presenza di una particolare proprietà, vediamo ora l'uso per vincolare un metodo.

protocol GeneratoreCasualeDiNumeri {

    func casuale() -> Double

}

 

class Casuale: GeneratoreCasualeDiNumeri {

 

    let limite: UInt32 = 100

    

    func casuale() -> Double {

        return Double(arc4random_uniform(limite))

    }

}

 

GeneratoreCasualeDiNumeri è un protocollo che impone a qualsiasi tipo conforme al protocollo di definire un metodo di nome casuale() che restituisca Double. La classe Casuale fa proprio questo.