Subscript ed estensioni generiche
Applichi vincoli a subscript ed estensioni.
Subscript ed estensioni generiche è 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.
Pedici generici
I pedici possono essere generici e avere propri parametri di tipo, indipendenti dal tipo che li contiene. In questo modo un singolo pedice può gestire molti tipi di input.
struct Lookup {
let data = [1, 2, 3, 4, 5]
subscript<S: Sequence>(indices idx: S) -> [Int] where S.Element == Int {
idx.map { data[$0] }
}
}
print(Lookup()[indices: [0, 2, 4]])Perché usare pedici generici
È possibile passare allo stesso pedice un Array, un Set o un Range di indici, perché accetta qualsiasi Sequence di Int.
struct Lookup {
let data = [10, 20, 30, 40]
subscript<S: Sequence>(_ idx: S) -> [Int] where S.Element == Int {
idx.map { data[$0] }
}
}
let l = Lookup()
print(l[0...1])
print(l[[3, 0]])Estensioni vincolate
Un extension ... where aggiunge membri disponibili solo quando il vincolo è soddisfatto. Tali membri compaiono sul tipo solo per gli argomenti generici compatibili.
extension Array where Element: Numeric {
func sumAll() -> Element { reduce(0, +) }
}
print([1, 2, 3].sumAll())
print([1.5, 2.5].sumAll())Estensione su un tipo di elemento specifico
Usi where Element == String per aggiungere agli array di stringhe helper specifici per String.
extension Array where Element == String {
func shout() -> [String] { map { $0.uppercased() + "!" } }
}
print(["hi", "bye"].shout())Estensione vincolata con un protocollo
Aggiunga un comportamento quando gli elementi sono conformi a un protocollo personalizzato.
protocol Priced { var price: Double { get } }
struct Item: Priced { let price: Double }
extension Collection where Element: Priced {
var total: Double { reduce(0) { $0 + $1.price } }
}
print([Item(price: 2), Item(price: 3)].total)Pedice generico con restituzione opzionale
Un pedice può essere generico e restituire un valore opzionale, ad esempio per eseguire un'indicizzazione sicura in una raccolta.
extension Array {
subscript(safe i: Int) -> Element? {
indices.contains(i) ? self[i] : nil
}
}
print([1, 2, 3][safe: 1] ?? -1)
print([1, 2, 3][safe: 9] ?? -1)Pedice generico su un dizionario
I pedici generici possono accettare una sequenza di chiavi e restituire i valori corrispondenti.
extension Dictionary {
subscript<S: Sequence>(keys ks: S) -> [Value] where S.Element == Key {
ks.compactMap { self[$0] }
}
}
let d = ["a": 1, "b": 2, "c": 3]
print(d[keys: ["a", "c"]].sorted())Combinazione con where su Self
Le estensioni sui tipi generici possono vincolare il tipo contenuto, rendendo disponibili API personalizzate.
struct Stack<T> { var items: [T] = [] }
extension Stack where T: Comparable {
var peakMax: T? { items.max() }
}
var s = Stack<Int>(); s.items = [3, 9, 1]
print(s.peakMax!)Pedice generico con più parametri
Un pedice può accettare contemporaneamente diversi argomenti e i propri parametri di tipo.
struct Grid {
let rows = [[1, 2], [3, 4]]
subscript(_ r: Int, _ c: Int) -> Int { rows[r][c] }
}
print(Grid()[1, 0])Sola lettura e lettura-scrittura
Come le proprietà, i pedici possono avere solo un get oppure sia get sia set per consentire la modifica.
struct Pad {
var values = [0, 0, 0]
subscript(i: Int) -> Int {
get { values[i] }
set { values[i] = newValue }
}
}
var p = Pad(); p[1] = 7
print(p.values)Riunire il tutto
I pedici generici e le estensioni vincolate consentono di creare API espressive e sicure dal punto di vista dei tipi, che si adattano ai tipi di elemento o di argomento utilizzati.
extension Array where Element: Comparable {
subscript(topAfterSort i: Int) -> Element { sorted()[i] }
}
print([5, 1, 9, 3][topAfterSort: 0])Verifica rapida
Verifichi la Sua comprensione dei pedici generici e delle estensioni vincolate.
Riepilogo
I pedici generici dichiarano i propri parametri di tipo e le proprie clausole where, consentendo a un singolo pedice di accettare molti tipi di input. Le estensioni vincolate (where Element: ... o == ...) aggiungono membri solo quando le condizioni sono soddisfatte. Insieme permettono di creare API sicure dal punto di vista dei tipi e adattabili.
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 «Subscript ed estensioni generiche» è gratuita?
Sì — il testo completo di «Subscript ed estensioni generiche» è 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 «Subscript ed estensioni generiche»?
Applichi vincoli a subscript ed estensioni. 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 «Subscript ed estensioni generiche»?
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
- Vincoli sui parametri di tipo
- Clausole where sulle funzioni
- Vincoli sui tipi associati
- Subscript ed estensioni generiche