O Swift oferece duas categorias principais de números: inteiros e números de ponto flutuante.
0, 1, -1, 42 e -273.0.0, 3.14 e -1.36969e-10.Você pode inserir sublinhados em literais numéricos para melhorar a legibilidade: 1_000_000 é idêntico a 1000000.
Literais de ponto flutuante podem ser escritos em notação decimal ou exponencial.
Na maioria dos casos, você usa Int para inteiros e Double para números de ponto flutuante:
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
O Swift oferece operadores aritméticos padrão para cálculos numéricos:
| Operador | Descrição | Exemplo |
|---|---|---|
+ |
Adição |
4 + 6 resulta em 10
|
- |
Subtração |
15 - 10 resulta em 5
|
* |
Multiplicação |
2 * 3 resulta em 6
|
O Swift é type-safe e não permite misturar tipos numéricos diferentes em operações aritméticas.
Você não pode somar ou multiplicar um Int e um Double diretamente; é preciso converter um dos tipos para que ele corresponda ao outro primeiro.
O operador / realiza a divisão.
Quando os dois operandos são inteiros, a divisão inteira trunca qualquer resto fracionário:
5.0 / 2.0 // 2.5 (Double division)
5 / 2 // 2 (integer division truncates the remainder)
Dividir um número de ponto flutuante diferente de zero por zero resulta em inf ou -inf.
Dividir 0.0 por 0.0 produz nan (Not a Number).
Em contraste, dividir um inteiro por zero causa um erro de compilação ou de execução:
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
O operador de resto (%) calcula o resto que sobra após a divisão de dois inteiros:
5 % 2 // 1
-5 % 2 // -1
// Dividing by zero produces an error:
// 5 % 0 // Error: Division by zero
No Swift, % é um operador de resto de verdade, e não um operador de módulo.
O resultado sempre assume o sinal do primeiro operando (o dividendo), independentemente do sinal do segundo operando:
5 % -2 // 1
-5 % 2 // -1
Você pode arredondar um número de ponto flutuante usando o método rounded().
Por padrão, rounded() arredonda para o inteiro mais próximo.
Você também pode fornecer uma regra de arredondamento específica, como .up ou .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 você declara uma constante ou variável numérica sem anotação de tipo, o Swift infere o tipo dela:
Int como padrão.Double como padrão.let x = 42 // Inferred as Int
let y = 42.0 // Inferred as Double
let z: Double = 42 // Explicitly typed as Double
Para realizar operações entre valores de tipos diferentes, converta um dos valores usando inicializadores de tipo como Double(_:) ou 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)
Neste exercício, você vai escrever código para ajudar um freelancer a se comunicar com os clientes sobre os preços de determinados projetos. Você vai escrever algumas funções utilitárias para calcular rapidamente os custos dos clientes.
Um cliente entra em contato com o freelancer para perguntar sobre seus valores. O freelancer explica que trabalha 8 horas por dia. No entanto, o freelancer conhece apenas o valor por hora do projeto. Ajude o freelancer a estimar o valor diário a partir do valor por hora.
Implemente a função dailyRateFrom(hourlyRate:), que recebe o argumento hourlyRate, que contém o valor por hora do freelancer.
A função deve retornar o valor diário com base no valor por hora.
dailyRateFrom(hourlyRate: 60)
// Returns 480.0
O valor diário retornado deve ser um Double.
Às vezes, um cliente tem interesse em contratar o freelancer por um período mais longo. O freelancer está disposto a dar um desconto ao cliente, mas apenas se o cliente o contratar por pelo menos um mês. No total, são 22 dias úteis. Ajude o freelancer a calcular o valor mensal a partir do valor por hora e da porcentagem de desconto sobre o valor fixo que ele está disposto a oferecer, arredondado para o número inteiro mais próximo.
Implemente a função monthlyRateFrom(hourlyRate:withDiscount:), que recebe os argumentos hourlyRate, que contém o valor por hora do freelancer, e withDiscount, que contém o desconto que o freelancer está disposto a dar ao cliente.
A função deve retornar o valor mensal arredondado para o número inteiro mais próximo.
monthlyRateFrom(hourlyRate: 77, withDiscount: 10.5)
// Returns 12129
Em outro dia, um gerente de projetos oferece ao freelancer a oportunidade de trabalhar em um projeto com orçamento fixo. Dados o orçamento fixo e o valor por hora do freelancer, ajude o freelancer a calcular o número de dias que trabalharia até o orçamento acabar. Leve em conta que, nesse cenário, o freelancer sempre está disposto a dar o desconto, independentemente do número de dias contratados. O resultado deve ser arredondado para baixo para o número inteiro mais próximo.
Implemente a função workdaysIn(budget:hourlyRate:withDiscount:), que recebe os argumentos:
budget, que contém o orçamento do projeto.hourlyRate, que contém o valor por hora do freelancer.withDiscount, que contém o desconto que o freelancer está disposto a dar ao cliente.A função deve retornar o número de dias úteis que o freelancer vai trabalhar no projeto, arredondado para baixo.
workdaysIn(budget: 20000, hourlyRate: 80, withDiscount: 11.0)
// Returns 35.0
Crie sua conta no Exercism para aprender e dominar Swift com 35 conceitos116 exercícios e mentoria humana de verdade, tudo de graça.