0Pricing
Swift Academy · Lezione

Implementazioni predefinite nelle estensioni

Fornisci comportamenti condivisi tramite le estensioni dei protocolli.

Implementazioni predefinite nelle estensioni è una lezione Swift Academy gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Swift Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Swift Academy include 4 lezioni in totale.

Il problema

I protocolli dichiarano requisiti, ma non forniscono comportamenti. Se ogni tipo conforme dovesse ripetere la stessa logica, il codice verrebbe duplicato. Le estensioni dei protocolli risolvono il problema fornendo implementazioni predefinite.

protocol Greeter {
    func greet() -> String
}

Aggiungere un'implementazione predefinita

Un'estensione del protocollo può implementare un requisito. I tipi conformi ottengono questo comportamento automaticamente, a meno che non lo sostituiscano con una propria implementazione.

protocol Greeter { func greet() -> String }

extension Greeter {
    func greet() -> String { "Hello!" }
}

struct Robot: Greeter {}
print(Robot().greet())

Sostituire l'implementazione predefinita

Un tipo conforme può fornire una propria implementazione, che ha la precedenza sull'implementazione predefinita dell'estensione.

protocol Greeter { func greet() -> String }
extension Greeter { func greet() -> String { "Hello!" } }

struct French: Greeter {
    func greet() -> String { "Bonjour!" }
}
print(French().greet())

Aggiungere metodi aggiuntivi

Le estensioni possono aggiungere metodi completamente nuovi che non sono presenti nel protocollo. Ogni tipo conforme li ottiene automaticamente.

protocol Named { var name: String { get } }

extension Named {
    func loudName() -> String { name.uppercased() }
}

struct City: Named { let name: String }
print(City(name: "paris").loudName())

Proprietà calcolate predefinite

Le estensioni possono anche fornire proprietà calcolate predefinite.

protocol Sized {
    var width: Double { get }
    var height: Double { get }
}

extension Sized {
    var area: Double { width * height }
}

struct Rect: Sized { let width: Double; let height: Double }
print(Rect(width: 2, height: 5).area)

Basarsi sui requisiti

Un'implementazione predefinita può chiamare i requisiti del protocollo stesso, componendo un comportamento più ricco a partire dal contratto minimo che ogni tipo deve fornire.

protocol Summable {
    var values: [Int] { get }
}

extension Summable {
    var total: Int { values.reduce(0, +) }
}

struct Cart: Summable { let values: [Int] }
print(Cart(values: [10, 20, 30]).total)

Estensioni con vincoli

Utilizzi una clausola where in modo che un'implementazione predefinita si applichi solo quando sono soddisfatte condizioni aggiuntive. Qui l'implementazione predefinita esiste solo quando anche Self è Equatable.

protocol Container {
    associatedtype Item
    var items: [Item] { get }
}

extension Container where Item: Equatable {
    func contains(_ x: Item) -> Bool { items.contains(x) }
}

struct Bag: Container { let items: [Int] }
print(Bag(items: [1, 2, 3]).contains(2))

Implementazione predefinita e requisito insieme

Può dichiarare un metodo nel protocollo E fornire un'implementazione predefinita. Elencarlo nel protocollo abilita il dispatch dinamico attraverso il tipo protocollo.

protocol Logger {
    func log() -> String
}
extension Logger {
    func log() -> String { "default log" }
}

struct A: Logger {}
struct B: Logger { func log() -> String { "B log" } }

let loggers: [Logger] = [A(), B()]
for l in loggers { print(l.log()) }

Attenzione al dispatch statico

Se un metodo è presente SOLO nell'estensione, e non nel protocollo, le chiamate tramite un valore tipizzato come protocollo utilizzano la versione dell'estensione, anche se il tipo concreto ne ha definita una propria. Lo dichiari nel protocollo per ottenere il dispatch dinamico.

protocol P {}
extension P { func who() -> String { "P-default" } }
struct Q: P { func who() -> String { "Q" } }

let direct = Q()
let asP: P = Q()
print(direct.who())
print(asP.who())

Ridurre il codice ripetitivo

La combinazione di una superficie minima di requisiti e di implementazioni predefinite ricche è il cuore della progettazione orientata ai protocolli: i tipi conformi implementano il minimo necessario e il comportamento condiviso risiede in un unico punto.

protocol Identifiable { var id: Int { get } }
extension Identifiable {
    var tag: String { "ID-" + String(id) }
}
struct Order: Identifiable { let id: Int }
print(Order(id: 7).tag)

Combinare più estensioni

Può suddividere le implementazioni predefinite in diverse estensioni per organizzare meglio il codice; tutte contribuiscono al tipo conforme.

protocol Money { var cents: Int { get } }
extension Money { var dollars: Double { Double(cents) / 100 } }
extension Money { var label: String { "$" + String(format: "%.2f", dollars) } }

struct Price: Money { let cents: Int }
print(Price(cents: 1299).label)

Verifica rapida

Verifichi la comprensione delle implementazioni predefinite nelle estensioni dei protocolli.

Riepilogo

Le estensioni dei protocolli forniscono implementazioni predefinite, consentendo ai tipi conformi di ereditare comportamenti condivisi e di sostituirli quando necessario. Può aggiungere metodi e proprietà calcolate, limitare le implementazioni predefinite con where e ha visto la regola del dispatch statico e dinamico: dichiari un metodo nel protocollo per ottenere il dispatch dinamico.

Domande Frequenti

La lezione «Implementazioni predefinite nelle estensioni» è gratuita?

Sì — il testo completo di «Implementazioni predefinite nelle estensioni» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Swift Academy, passa a CoddyKit PRO. Il corso Swift Academy include 4 lezioni in totale.

Cosa imparerò in «Implementazioni predefinite nelle estensioni»?

Fornisci comportamenti condivisi tramite le estensioni dei protocolli. Eserciti Swift Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Swift Academy?

Non è richiesta alcuna esperienza precedente. Swift Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.

Quanto tempo richiede la lezione «Implementazioni predefinite nelle estensioni»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Swift Academy?

Sì. Ogni lezione Swift Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. I protocolli come contratti
  2. Implementazioni predefinite nelle estensioni
  3. Composizione dei protocolli
  4. Conformità condizionale
← Torna a Swift Academy