Swift fornisce due categorie principali di numeri: i numeri interi e i numeri in virgola mobile.
0, 1, -1, 42 e -273.0.0, 3.14 e -1.36969e-10.Puoi inserire dei trattini bassi nei letterali numerici per migliorarne la leggibilità: 1_000_000 è identico a 1000000.
I letterali in virgola mobile si possono scrivere in notazione decimale o esponenziale.
Nella maggior parte dei casi, usi Int per i numeri interi e Double per i numeri in virgola mobile:
let speed: Int = 42 // Explicit Int
let pi: Double = 3.14 // Explicit Double
let giga: Double = 1_000_000_000 // Double with readability underscores
let plancksConstant: Double = 6.62607015e-34 // Double in scientific notation
Swift fornisce i operatori aritmetici standard per i calcoli numerici:
| Operatore | Descrizione | Esempio |
|---|---|---|
+ |
Addizione |
4 + 6 vale 10
|
- |
Sottrazione |
15 - 10 vale 5
|
* |
Moltiplicazione |
2 * 3 vale 6
|
Swift è type-safe e non permette di mescolare tipi numerici diversi nelle operazioni aritmetiche.
Non puoi sommare o moltiplicare direttamente un Int e un Double: devi prima convertire un tipo per farlo corrispondere all'altro.
L'operatore / esegue la divisione.
Quando entrambi gli operandi sono numeri interi, la divisione intera tronca l'eventuale parte frazionaria:
5.0 / 2.0 // 2.5 (Double division)
5 / 2 // 2 (integer division truncates the remainder)
Dividere un numero in virgola mobile diverso da zero per zero dà come risultato inf o -inf.
Dividere 0.0 per 0.0 produce nan (Not a Number).
Al contrario, dividere un numero intero per zero causa un errore in fase di compilazione o di esecuzione:
print(5.0 / 0.0) // Prints inf
print(-5.0 / 0.0) // Prints -inf
print(0.0 / 0.0) // Prints nan
// The following line will not compile:
// print(5 / 0) // Error: Division by zero
L'operatore resto (%) calcola il resto che rimane dopo aver diviso due numeri interi:
5 % 2 // 1
-5 % 2 // -1
// Dividing by zero produces an error:
// 5 % 0 // Error: Division by zero
In Swift, % è un vero operatore di resto, non un operatore modulo.
Il risultato prende sempre il segno del primo operando (il dividendo), indipendentemente dal segno del secondo operando:
5 % -2 // 1
-5 % 2 // -1
Puoi arrotondare un numero in virgola mobile usando il metodo rounded().
Per impostazione predefinita, rounded() arrotonda all'intero più vicino.
Puoi anche specificare una regola di arrotondamento, come .up o .down:
let x = 3.14
let y = x.rounded() // 3.0
let w = x.rounded(.down) // 3.0
let z = x.rounded(.up) // 4.0
Quando dichiari una costante o una variabile numerica senza annotazione di tipo, Swift ne deduce il tipo:
Int per impostazione predefinita.Double per impostazione predefinita.let x = 42 // Inferred as Int
let y = 42.0 // Inferred as Double
let z: Double = 42 // Explicitly typed as Double
Per eseguire operazioni tra valori di tipi diversi, converti un valore usando gli inizializzatori di tipo come Double(_:) o Int(_:):
let integerCount = 42
let floatingCount = Double(integerCount)
print(floatingCount) // Prints 42.0
let pi = 3.14
let integerPi = Int(pi)
print(integerPi) // Prints 3 (fractional part is truncated)
In questo esercizio scriverai del codice per aiutare un freelancer a comunicare con i propri clienti i prezzi di alcuni progetti. Scriverai alcune funzioni ausiliarie per calcolare rapidamente i costi per i clienti.
Un cliente contatta il freelancer per chiedere informazioni sulle sue tariffe. Il freelancer spiega che lavora 8 ore al giorno. Tuttavia, il freelancer conosce solo la propria tariffa oraria per il progetto. Aiutalo a stimare una tariffa giornaliera a partire da una tariffa oraria.
Implementa la funzione dailyRateFrom(hourlyRate:), che prende l'argomento hourlyRate, che contiene la tariffa oraria del freelancer.
La funzione dovrebbe restituire la tariffa giornaliera calcolata in base alla tariffa oraria.
dailyRateFrom(hourlyRate: 60)
// Returns 480.0
La tariffa giornaliera restituita dovrebbe essere un Double.
A volte un cliente è interessato ad assumere il freelancer per un periodo più lungo. Il freelancer è disposto a concedere uno sconto al cliente, ma solo se il cliente lo assume per almeno un mese. In totale ci sono 22 giorni lavorativi. Aiuta il freelancer a calcolare la tariffa mensile, a partire dalla sua tariffa oraria e dalla percentuale di sconto applicata alla tariffa fissa che è disposto a concedere, arrotondando al numero intero più vicino.
Implementa la funzione monthlyRateFrom(hourlyRate:withDiscount:), che prende gli argomenti hourlyRate, che contiene la tariffa oraria del freelancer, e withDiscount, che contiene lo sconto che il freelancer è disposto a concedere al cliente.
La funzione dovrebbe restituire la tariffa mensile arrotondata al numero intero più vicino.
monthlyRateFrom(hourlyRate: 77, withDiscount: 10.5)
// Returns 12129
Un altro giorno, un project manager propone al freelancer di lavorare a un progetto con un budget fisso. Dato il budget fisso e la tariffa oraria del freelancer, aiutalo a calcolare il numero di giorni che lavorerebbe fino a esaurire il budget. Tieni presente che in questo scenario il freelancer è sempre disposto a concedere lo sconto, indipendentemente dal numero di giorni. Il risultato deve essere arrotondato per difetto al numero intero più vicino.
Implementa la funzione workdaysIn(budget:hourlyRate:withDiscount:), che prende gli argomenti:
budget, che contiene il budget per il progetto.hourlyRate, che contiene la tariffa oraria del freelancer.withDiscount, che contiene lo sconto che il freelancer è disposto a concedere al cliente.La funzione dovrebbe restituire il numero di giorni lavorativi che il freelancer lavorerà al progetto, arrotondato per difetto.
workdaysIn(budget: 20000, hourlyRate: 80, withDiscount: 11.0)
// Returns 35.0
Iscriviti a Exercism per imparare e padroneggiare Swift con 35 concetti116 esercizi e il mentoring di persone reali, tutto gratis.