2016-04-24 13 views
15

Tipi che rappresentano numeri, caratteri e stringhe implementate utilizzando le strutture in rapido.In Int, String ecc. Sono considerati "primitivi" in Swift?

Un estratto dal official documentation:

I tipi di dati che sono normalmente considerati di base o primitivi in ​​altre lingue, ad esempio i tipi che rappresentano numeri, caratteri e archi-sono in realtà nominati tipi, definiti e implementato nella libreria standard Swift utilizzando le strutture.

Vuol dire che la seguente:

Int 
Float 
String 
// etc 

... non sono considerati primitivi?

risposta

17

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.

+0

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

+0

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

2

Proprio come Ruby, Swift non ha tipi primitivi.

Int per esempio è implementata come struct e conforme ai protocolli:

BitwiseOperationsType
CVarArgType
comparable
CustomStringConvertible
equatable
hashable
MirrorPathType
RandomAccessIndexType
SignedIntegerType
SignedNumberType

È possibile controllare il codice sorgente di Bool.swift dove Bool è implemented.

2

Swift non ha tipi primitivi.

In tutti i linguaggi di programmazione, abbiamo tipi di base che sono disponibili parte della lingua. In rapido, abbiamo utilizzato questi tipi attraverso la libreria standard Swift, creata usando le strutture. Questi includono i tipi di numeri, caratteri e stringhe.

enter image description here

2

ci sono primitive a Swift.

Tuttavia, vi è una distinzione tra "tipi di valore" e "tipi di riferimento". Che non si adatta perfettamente all'uso C++ o Java.

4

No, non sono primitivi nel senso che le altre lingue definiscono le primitive. Ma si comportano proprio come i primitivi, nel senso che sono passati per valore. Ciò è conseguenza del fatto che sono implementati internamente dalle strutture. Considerare:

import Foundation 

struct ByValueType { 
    var x: Int = 0; 
} 

class ByReferenceType { 
    var x: Int = 0; 
} 

var str: String = "no value"; 
var byRef: ByReferenceType = ByReferenceType(); 
var byVal: ByValueType = ByValueType(); 

func foo(var type: ByValueType) { 
    type.x = 10; 
} 
func foo(var type: ByReferenceType) { 
    type.x = 10; 
} 

func foo(var type: String) { 
    type = "foo was here"; 
} 

foo(byRef); 
foo(byVal); 
foo(str); 

print(byRef.x); 
print(byVal.x); 
print(str); 

L'uscita è

10 
0 
no value 
0

Sono parziali primitive.

Swift non espone il primitivo come altro linguaggio (Java). Ma Int, Int16, Float, Double sono definiti utilizzando una struttura che si comporta come il tipo di dati di primitive derivate (Structure) e non un puntatore a oggetti.

Documentazione Swift favorendo di caratteristica primitiva:

1.They hanno estensione hashable dire

Axiom:x == y implica x.hashValue == y.hashValue. e hashValue è il valore assegnato corrente.

2. La maggior parte del metodo init viene utilizzata per il controllo della trasmissione dei tipi e il controllo di overflow (ricordare che swift è sicuro).

Int.init(_ other: Float) 

3. Vedere il codice sottostante Int con valore predefinito 0 con tipo opzionale. Mentre NSNumber stampa nil con variabile di tipo opzionale.

var myInteger:Int? = Int.init() 
print(myInteger) //Optional(0) 
var myNumber:NSNumber? = NSNumber.init() 
print(myNumber) //nil 

Documentazione Swift non favorendo a caratteristica primitiva:

  1. Come da doc, sono di due tipi: tipi denominati e tipi di composti. Nessun concetto di tipi di primitivi.
  2. Estensione supporto interno interno Int: Lavabile {}
  3. Tutti questi tipi disponibili tramite la libreria standard Swift non sono come parole chiave standard.
Problemi correlati