Sì e no ...
Come altre risposte hanno notato, in Swift non c'è alcuna differenza a livello di linguaggio tra le cose che si pensa come "primitivi" in altre lingue e gli altri tipi struct nella libreria standard o dei tipi di valore che è possibile creare te stesso. Ad esempio, non è come Java, dove c'è una grande differenza tra int
e Integer
e non è possibile creare i propri tipi che si comportano semanticamente come il primo. In Swift, tutti i tipi sono "non primitivi" o "a livello utente": le caratteristiche linguistiche che definiscono la sintassi e la semantica di, per esempio, Int
non sono diverse da quelle che definiscono CGRect
o UIScrollView
o tipi personalizzati.
Tuttavia, c'è ancora una differenza. Una CPU ha istruzioni native per attività come l'aggiunta di numeri interi, la moltiplicazione di float e persino l'uso di prodotti cross vector, ma non quelli come l'inserimento di rects o liste di ricerca. Una delle cose di cui parlano le persone quando chiamano "primitivamente" alcuni dei tipi di una lingua è che quelli sono i tipi per i quali il compilatore fornisce gli hook nell'architettura della CPU sottostante, così che le cose che fai con questi tipi si mappano direttamente alla CPU di base Istruzioni. (Cioè, così come le operazioni di "aggiungere due numeri interi" non impantanarsi nelle ricerche di oggetto e chiamate di funzione.)
Swift ha ancora questa distinzione - alcuni tipi di libreria standard come Int
e Float
sono speciali, nel senso che la mappa alle operazioni di base della CPU. (E in Swift, il compilatore non offre altri mezzi per accedere direttamente a tali operazioni.)
La differenza con molti altri linguaggi è che per Swift, la distinzione tra tipi "primitivi" e altrimenti è un dettaglio di implementazione di la libreria standard, non una "caratteristica" della lingua.
Proprio a divagare su questo argomento un po 'più ...
Quando si parla di stringhe di essere un tipo "primitivo" in molte lingue, che è un significato diverso della parola - le stringhe sono di un livello di astrazione più lontana dalla CPU rispetto agli interi e ai float.
Le stringhe "primitive" in altre lingue di solito indicano qualcosa di simile a C o Java: il compilatore ha un caso particolare in cui mettere qualcosa tra virgolette comporta l'incorporazione di alcuni dati nel programma binario e il posto nel codice in cui hai scritto che ottenere un puntatore a quei dati, possibilmente avvolto in una sorta di interfaccia oggetto in modo da poter fare un'elaborazione del testo utile con esso. (Ovvero, una stringa letterale.) Forse il compilatore ha anche casi speciali in modo da poter avere scorciatoie utili per alcune di quelle procedure di elaborazione del testo, come +
per la concatenazione.
In Swift, String
è "primitivo" in quanto è il standard tipo di stringa utilizzato da tutte le funzioni relative al testo nella libreria standard. Ma non c'è magia del compilatore che ti impedisca di creare i tuoi tipi di stringhe che possono essere creati con letterali o gestiti con operatori. Quindi, di nuovo, c'è molto meno differenza tra "primitivi" e tipi di utenti in Swift.
Ma se 'Int' è implementato nella libreria standard, deve comunque fare affidamento su alcuni" primitivi ". Quali sono quei primitivi? Cosa succede se voglio implementare il mio 'Int'? Come rappresenterei un primitivo numero a 32 bit, ad esempio? – algrid
Guardate indietro alla risposta: * "E in Swift, il compilatore non offre altri mezzi per accedere direttamente a tali operazioni." * Se guardate il [open source] (https://github.com/apple)/swift/tree/fa2f2bd4577e536130f9298fabfd2960a357693c/stdlib/public/core) per la libreria standard, vedrete che molti dei tipi "primitivi" si connettono agli hook nel compilatore stesso tramite lo spazio dei nomi 'Builtin'. Questo genere di cose è il primo passo verso le istruzioni base della CPU di cui ho parlato in questa risposta, e IIRC il compilatore Swift non lo rende disponibile per il codice al di fuori della libreria standard. – rickster