2015-12-16 11 views
8

ho visto ci sono molti tipi interi a Swift diverso Int, ad esempio:In Swift (app per iOS), quando è necessario utilizzare altri tipi di numeri interi?

Int8 
UInt32 
uint_fast16_t 

Posso capire le loro definizioni, ma mi chiedo quando/perché li dovrei usare al posto di Int?

Ad esempio, Int8 è un numero intero a 8 bit. Dalla mia comprensione, a meno che non voglia salvare un po 'di memoria, perché preoccuparsi di usarlo?

PS. Sto usando Swift per lo sviluppo di app per iOS.

+0

È necessario utilizzare sempre Int, Double e String. Utilizza solo altri numeri interi quando sono obbligatori. –

+1

Certo, ma la mia domanda è sapere quando/dove è necessario? Sarebbe fantastico se tu potessi dare ulteriori spiegazioni. Grazie. –

+0

let x: Int = 3; arc4random_uniform (UInt32 (x)) –

risposta

4

Nello stesso modo che Swift ha altri aspetti sotto le coperte come puntatori, questi tipi numerici ci sono per scopi specifici . Alcuni di questi scopi sono:

  • Integrazione con una libreria C. Potrebbero esserci tipi C specifici richiesti da una libreria C e questi tipi consentono di passare dati alle/dalle librerie

  • Set di dati scientifici di grandi dimensioni. Float (punto a virgola mobile di precisione a 32 bit) consente di conservare il doppio degli elementi nella memoria nello stesso spazio di Double con un certo sacrificio per la precisione. I set di dati ambientali globali di più giorni provenienti da sensori satellitari, dataset di astronomia, ecc. Hanno enormi requisiti di spazio.

  • Half-precisione in virgola mobile richiede metà la memorizzazione e la larghezza di banda del galleggiante e può essere pertinente per alcune applicazioni grafiche

  • elaborazione vettoriale utilizzando la libreria Accelerate. Le funzioni di accelerazione funzionano con una varietà di tipi numerici e accuratezza di precisione singola a 32 bit potrebbe essere accettabile per l'attività che si desidera eseguire.

+1

Oggi volevo codificare una variabile id e so che l'id è compresa tra 1 e 20. In questo caso, dovrei semplicemente usare 'Int8'? o è troppo banale che posso semplicemente ignorare considerando l'ambiente di destinazione (dispositivi iOS)? O forse dovrei chiedere questo in una domanda separata? –

+1

Vorrei semplicemente usare 'Int'. L'utilizzo di interi a 8 bit ti rende più probabile avere problemi di overflow e qualsiasi risparmio di memoria sarà banale. – timbo

0

Per citare il guide:

utilizzare il tipo di Int per tutte le costanti intere general-purpose e le variabili nel codice, anche se sono noti per essere non negativo. [...] Utilizzare gli altri tipi interi solo quando sono specificamente necessari per l'attività a causa di dati di dimensioni esplicite da una fonte esterna o per prestazioni, utilizzo della memoria o altra necessaria ottimizzazione . L'utilizzo di tipi di dimensioni esplicite in queste situazioni aiuta a rilevare eventuali overflow di valore accidentale e documenta in modo implicito la natura dei dati utilizzati .

+1

Per gli scopi "prestazioni" e "utilizzo della memoria", ulteriori commenti/risposte su questo? –

1

Come altri hanno già accennato, a volte c'è bisogno di interoperabilità con alcune librerie esterne (C), o semplicemente si vogliono porre dei vincoli sui valori ammessi/rilevati in eccesso.

A titolo di esempio, si consideri questo gist ho fatto qualche tempo fa:

import UIKit 

extension UIColor 
{ 
    convenience init(
     redByte red:UInt8, 
     greenByte green:UInt8, 
     blueByte blue:UInt8, 
     alphaByte alpha:UInt8 
     ) 
    { 
     self.init(
      red: CGFloat(red )/255.0, 
      green: CGFloat(green)/255.0, 
      blue: CGFloat(blue)/255.0, 
      alpha: CGFloat(alpha)/255.0 
     ) 
    } 
} 

...che è una comoda scorciatoia per creare un'istanza UIColor quando si conoscono i valori dei componenti che si desidera utilizzare come "byte" (interi nell'intervallo 0-255), invece di "normalizzati" (cioè 0.0 ~ 1.0) .

L'utilizzo del tipo specifico UInt8 invece del codice nativo di Swift Int applica la politica (e chiarisce l'intento) che gli argomenti devono essere senza segno, valori interi a 8 bit.

+0

_Off-topic, trovo l'essenza particolarmente utile dal momento che gli strumenti utilizzati dai progettisti (ad esempio Adobe Illustrator) tipicamente riportano i valori dei componenti di colore in questo formato. –

Problemi correlati