Vincoli (where), inferenza dei tipi
Imponga vincoli al codice generico usando where (ad esempio, vincoli Equatable/Comparable o su Element) e osservi come Swift inferisce i tipi generici nei punti di chiamata.
Vincoli (where), inferenza dei tipi è una lezione Swift Academy gratuita su CoddyKit. Questa è la lezione 2 di 3. 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 3 lezioni in totale.
Perché i vincoli?
Aggiunga vincoli affinché il codice generico possa usare determinate operazioni, come == o <. L'inferenza dei tipi di Swift sceglie quindi i tipi concreti nelle chiamate.
Vincolo Equatable
where T: Equatable consente i confronti di uguaglianza. Senza di esso, == non è disponibile per un T qualsiasi.
// Find the first index of value in an array of T
func indexOf<T>(_ value: T, in array: [T]) -> Int? where T: Equatable {
for (i, x) in array.enumerated() {
if x == value { return i } // allowed because T: Equatable
}
return nil
}
print(indexOf(3, in: [1,2,3,2]) ?? -1) // 2
print(indexOf("b", in: ["a","b","c"]) ?? -1) // 1Vincolo Comparable
L'utilizzo di un vincolo come T: Comparable abilita le operazioni di ordinamento, come <.
// Return the minimum value of a collection when elements are Comparable
func minimum<T: Comparable>(_ xs: [T]) -> T? {
guard var best = xs.first else { return nil }
for x in xs.dropFirst() {
if x < best { best = x }
}
return best
}
print(minimum([7,3,9]) ?? -1) // 3
print(minimum(["b","a","c"]) ?? "?") // "a"Estensione con where
Utilizzi where Element: ... per aggiungere API solo per determinati tipi di elemento, in questo caso gli array di Equatable.
// Add a helper only when the array's Element is Equatable
extension Array where Element: Equatable {
func removingDuplicates() -> [Element] {
var seen: [Element] = []
for x in self {
if !seen.contains(x) { seen.append(x) }
}
return seen
}
}
print([1,2,2,3].removingDuplicates()) // [1,2,3]Vincoli multipli
Combini i vincoli: vincoli il tipo generico e i suoi tipi associati, ad esempio S.Element: Equatable.
// Require both Sequence and Equatable elements; force same-type relationship
func allEqual<S>(_ s: S) -> Bool
where S: Sequence, S.Element: Equatable {
var it = s.makeIterator()
guard let first = it.next() else { return true }
while let v = it.next() { if v != first { return false } }
return true
}
print(allEqual([2,2,2])) // true
print(allEqual([1,2,1])) // falseL'inferenza nella pratica
Swift inferisce i parametri generici dagli argomenti e dal contesto, quindi raramente deve specificare esplicitamente <T>.
// Inference: compiler deduces concrete types
let i = indexOf(10, in: [5,10,15]) // T is Int
let j = minimum(["z","x"]) // T is String
print(i ?? -1, j ?? "")Significato di where
Verifica rapida: che cosa fa una clausola where?
Riepilogo
Riepilogo: imponga vincoli ai generics con where, ad esempio T: Equatable o Element: Comparable, e si affidi all'inferenza dei tipi di Swift per scegliere i tipi concreti nelle chiamate.
Domande Frequenti
La lezione «Vincoli (where), inferenza dei tipi» è gratuita?
Sì — il testo completo di «Vincoli (where), inferenza dei tipi» è 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 3 lezioni in totale.
Cosa imparerò in «Vincoli (where), inferenza dei tipi»?
Imponga vincoli al codice generico usando where (ad esempio, vincoli Equatable/Comparable o su Element) e osservi come Swift inferisce i tipi generici nei punti di chiamata. 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 3.
Quanto tempo richiede la lezione «Vincoli (where), inferenza dei tipi»?
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
- Funzioni e tipi generici
- Vincoli (where), inferenza dei tipi
- Algoritmi generici sulle collezioni