Swift Academy · Lezione

Vincoli generici e clausole where

Applicare vincoli multipli, requisiti di uguaglianza tra tipi ed estensioni condizionali.

Lezione 1 di 413 passaggi

Vincoli generici e clausole where è una lezione Swift Academy gratuita su CoddyKit. Questa è la lezione 1 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.

Riepilogo delle basi dei generics

I generics consentono di scrivere codice flessibile e riutilizzabile che funziona con qualsiasi tipo.

func identity<T>(_ value: T) -> T { return value }
print(identity(42))
print(identity("hello"))

Vincolo su un singolo tipo

Limita un parametro generico affinché sia conforme a un protocollo usando T: Protocol.

func largest<T: Comparable>(_ a: T, _ b: T) -> T {
  return a > b ? a : b
}
print(largest(3, 7))

Vincoli multipli con &

Richiede che un tipo sia conforme a diversi protocolli combinandoli con &.

func process<T: Equatable & Hashable>(_ items: [T]) -> Set<T> {
  return Set(items)
}
print(process([1,2,2,3]))

Clausole where sulle funzioni

Una clausola where dopo l'elenco dei parametri consente di aggiungere vincoli più precisi.

func allEqual<T: Equatable>(_ array: [T]) -> Bool where T: CustomStringConvertible {
  guard let first = array.first else { return true }
  return array.allSatisfy { $0 == first }
}

where nelle estensioni

Estende un tipo solo quando il suo parametro generico soddisfa un requisito.

extension Array where Element: Numeric {
  var sum: Element { reduce(0, +) }
}
print([1,2,3].sum)

Requisiti di uguaglianza dei tipi

Impone che due tipi associati siano lo stesso tipo con T == U.

func zip2<A: Sequence, B: Sequence>(_ a: A, _ b: B) -> [(A.Element, B.Element)]
  where A.Element == B.Element {
  return Swift.zip(a, b).map { ($0.0, $0.1) }
}

Conformità condizionale

Rende un tipo generico conforme condizionalmente a un protocollo quando i suoi parametri soddisfano i vincoli.

extension Array: Equatable where Element: Equatable {
  // stdlib already does this, shown for illustration
}
print([1,2] == [1,2])

Class generiche con vincoli

I generics delle classi possono anch'essi avere vincoli, garantendo la sicurezza dei tipi al momento dell'istanza.

class Box<T: Codable> {
  var value: T
  init(_ v: T) { self.value = v }
}
let box = Box(42)

Protocollo con vincoli sui tipi associati

Usa where nelle definizioni dei protocolli per imporre vincoli ai tipi associati.

protocol Container {
  associatedtype Item: Equatable
  var items: [Item] { get }
  func contains(_ item: Item) -> Bool
}

Più clausole where

Combina più condizioni where, separate da virgole, per requisiti complessi.

func merge<C: Collection>(_ a: C, _ b: C) -> [C.Element]
  where C.Element: Comparable, C.Element: Hashable {
  return Array(Set(a + b)).sorted()
}

Specializzazione dei tipi generici

Swift specializza le funzioni generiche in fase di compilazione per i tipi concreti, abilitando l'ottimizzazione delle prestazioni.

// @_specialize instructs the compiler to emit a specialized version
@_specialize(where T == Int)
func add<T: Numeric>(_ a: T, _ b: T) -> T { a + b }

Verifica rapida

Come si richiede che un tipo generico sia conforme sia a Comparable sia a Hashable?

Riepilogo della lezione

I vincoli sui generics con T: Protocol, i vincoli multipli tramite &, le clausole where per requisiti precisi, i requisiti di uguaglianza dei tipi e la conformità condizionale consentono di controllare con precisione il codice generico.

Gratis per iniziare

Impara Swift con un tutor IA — gratis

Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.

Corsi
122
Lezioni
409

Domande Frequenti

La lezione «Vincoli generici e clausole where» è gratuita?

Sì — il testo completo di «Vincoli generici e clausole where» è 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 «Vincoli generici e clausole where»?

Applicare vincoli multipli, requisiti di uguaglianza tra tipi ed estensioni condizionali. 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 1 di 4.

Quanto tempo richiede la lezione «Vincoli generici e clausole where»?

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. Vincoli generici e clausole where
  2. Tipi opachi con la parola chiave some
  3. Existential con any e type erasure
  4. Associated type primari e typed throws
← Torna a Swift Academy