Conformità condizionale
Rendi un tipo genericamente conforme solo quando i vincoli sono soddisfatti.
Conformità condizionale è una lezione Swift Academy gratuita su CoddyKit. Questa è la lezione 4 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.
Che cos'è la conformità condizionale
La conformità condizionale fa sì che un tipo generico sia conforme a un protocollo solo quando i suoi parametri di tipo soddisfano determinati vincoli. L'esempio classico è il seguente: un Array è Equatable solo se lo è il suo Element.
extension Array where Element: Equatable {
func allEqual(to x: Element) -> Bool {
allSatisfy { $0 == x }
}
}Esempio integrato
La libreria standard lo utilizza già: [Int] è Equatable perché lo è Int. Due array vengono confrontati elemento per elemento.
let a = [1, 2, 3]
let b = [1, 2, 3]
print(a == b)Dichiarare la conformità condizionale
Scriva un'estensione che aggiunga la conformità a un protocollo con una clausola where. In questo caso, un wrapper è conforme a Equatable solo quando lo è il tipo del suo valore.
struct Pair<T> {
let first: T
let second: T
}
extension Pair: Equatable where T: Equatable {
static func == (l: Pair, r: Pair) -> Bool {
l.first == r.first && l.second == r.second
}
}
print(Pair(first: 1, second: 2) == Pair(first: 1, second: 2))Perché il vincolo è importante
Senza il vincolo, il compilatore non potrebbe sintetizzare ==, perché per confrontare il valore incapsulato è necessario che il valore stesso sia confrontabile. La clausola where fornisce esattamente questa garanzia.
struct Box<T> { let value: T }
extension Box: Equatable where T: Equatable {}
print(Box(value: "hi") == Box(value: "hi"))
print(Box(value: 5) == Box(value: 9))Codable condizionale
È possibile ottenere la conformità condizionale a Codable. Un contenitore è codificabile solo se lo è il suo elemento.
struct Wrapper<T> { let payload: T }
extension Wrapper: Codable where T: Codable {}
let w = Wrapper(payload: 42)
let data = try! JSONEncoder().encode(w)
print(String(data: data, encoding: .utf8)!)Più vincoli
Una clausola where può elencare diversi requisiti separati da virgole.
struct Stack<T> { var items: [T] = [] }
extension Stack where T: Comparable {
func maxItem() -> T? { items.max() }
}
var s = Stack<Int>()
s.items = [3, 9, 1]
print(s.maxItem()!)CustomStringConvertible condizionale
Renda un tipo stampabile solo quando lo sono i suoi contenuti, componendo le descrizioni degli elementi.
struct Labeled<T> { let label: String; let value: T }
extension Labeled: CustomStringConvertible where T: CustomStringConvertible {
var description: String { label + ": " + value.description }
}
print(Labeled(label: "Age", value: 30))Conformità condizionale annidata
La conformità condizionale è componibile: un array di array di Int è Equatable perché ogni livello concatena il vincolo.
let grid1 = [[1, 2], [3, 4]]
let grid2 = [[1, 2], [3, 4]]
print(grid1 == grid2)Vincolo su un altro protocollo
La clausola where può richiedere che l'elemento sia conforme a un protocollo definito da Lei, rendendo disponibili i comportamenti basati su quel protocollo.
protocol Priced { var price: Double { get } }
struct Item: Priced { let price: Double }
extension Array where Element: Priced {
var totalPrice: Double { reduce(0) { $0 + $1.price } }
}
print([Item(price: 1.5), Item(price: 2.5)].totalPrice)Vincoli di uguaglianza tra tipi
È possibile vincolare un tipo associato a un tipo specifico usando ==. In questo caso, i metodi si applicano solo agli array di String.
extension Array where Element == String {
func joinedUpper() -> String {
map { $0.uppercased() }.joined(separator: "-")
}
}
print(["a", "b", "c"].joinedUpper())Come lo utilizza il compilatore
La conformità condizionale consente al compilatore di assegnare i vantaggi di un protocollo esattamente quando sono validi, così il codice generico rimane sicuro e riutilizzabile al massimo.
struct Optional2<T> { let value: T? }
extension Optional2: Equatable where T: Equatable {
static func == (l: Optional2, r: Optional2) -> Bool { l.value == r.value }
}
print(Optional2(value: 1) == Optional2(value: 1))Verifica rapida
Verifichi la Sua comprensione della conformità condizionale.
Riepilogo
La conformità condizionale usa extension Type: Protocol where ... per concedere la conformità solo quando i parametri di tipo soddisfano determinati vincoli. È stata illustrata con Equatable, Codable e CustomStringConvertible, usando vincoli su protocolli, vincoli di uguaglianza tra tipi (==) e annidamento. In questo modo i tipi generici restano sicuri e riutilizzabili.
Domande Frequenti
La lezione «Conformità condizionale» è gratuita?
Sì — il testo completo di «Conformità condizionale» è 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 «Conformità condizionale»?
Rendi un tipo genericamente conforme solo quando i vincoli sono soddisfatti. 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 4 di 4.
Quanto tempo richiede la lezione «Conformità condizionale»?
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
- I protocolli come contratti
- Implementazioni predefinite nelle estensioni
- Composizione dei protocolli
- Conformità condizionale