Swift va bene per algoritmi e strutture dati?
Sì. Generics, protocolli come Comparable e Hashable, e gli optional rendono esplicito nel tipo un nodo il cui next può essere nil, e il compilatore controlla ogni uso. Due cose conviene saperle presto: la libreria standard è essenziale, quindi la coda e l'heap te li scrivi tu; e le collezioni sono valori, quindi assegnare un array a una nuova variabile e modificarlo lascia intatto l'originale, cosa che sorprende chi arriva da Java o JavaScript.
Quali tipi di Swift corrispondono a quali strutture dati?
Array è un array dinamico e una pila, con append e popLast(); Dictionary e Set sono tabelle hash. Questa è tutta la libreria standard. Il pacchetto open source swift-collections di Apple aggiunge Deque, Heap, OrderedSet e OrderedDictionary; la lista concatenata, l'albero, il trie e il grafo li scrivi tu, nel primo e nel secondo passaggio.
Perché in Swift un nodo di albero deve essere una classe?
Perché una struct è un valore. Non può contenere una proprietà memorizzata del proprio tipo, nemmeno opzionale, e ovunque ne contenga copie, come in un array, modificare una copia lascia intatto l'originale. Un'istanza di classe è un riferimento, quindi i nodi possono puntarsi a vicenda; funziona anche un indirect enum, per alberi che non modifichi mai sul posto. Il problema è ARC: un puntatore al genitore deve essere weak, altrimenti genitore e figlio si tengono in vita a vicenda e l'albero non viene mai liberato.
Come si scrive una coda veloce in Swift?
Non con removeFirst(): su un Array sposta ogni elemento rimanente, quindi ogni estrazione costa O(n). Tieni un indice di testa e fallo avanzare, oppure usa due array: inserisci in un array di ingresso, estrai da uno di uscita, e riempi quello di uscita invertendo quello di ingresso quando si svuota. Entrambi i metodi rendono l'estrazione O(1) ammortizzato. Il Deque di swift-collections lo fa per te, e nel primo passaggio costruisci una coda da te.
Quali corsi di questo percorso non sono insegnati in Swift?
Tre: la programmazione dinamica e la serie di colloqui in Python, insegnate in Python, e la manipolazione dei bit, insegnata in C++. Sono elencati dopo i passaggi, ognuno con un link che lo apre nel suo linguaggio. Una memoizzazione in Swift è un array o un Dictionary, e gli interi di Swift hanno nonzeroBitCount e trailingZeroBitCount, che fanno con una sola proprietà ciò che un trucco sui bit in C++ fa a mano.
Devo conoscere Swift prima di iniziare questo percorso?
Almeno struct, classi, optional, generics e protocolli. Se sono argomenti nuovi, il corso di Swift di Coddy li copre prima, gratis, e questo percorso riprende da dove finisce.