Tracks
/
Swift
Swift
/
Ejercicios
/
Tarifas de freelancer
Tarifas de freelancer

Tarifas de freelancer

Ejercicio de aprendizaje

Introducción

Números

Swift ofrece dos categorías principales de números: los enteros y los números de punto flotante.

  • Los enteros representan números sin parte fraccionaria, como 0, 1, -1, 42 y -273.
  • Los números de punto flotante representan números con una parte fraccionaria, como 0.0, 3.14 y -1.36969e-10.

Puedes insertar guiones bajos en los literales numéricos para mejorar la legibilidad: 1_000_000 es idéntico a 1000000. Los literales de punto flotante se pueden escribir en notación decimal o exponencial.

En la mayoría de los casos, usas Int para los enteros y Double para los números de punto flotante:

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

Operadores aritméticos

Swift ofrece operadores aritméticos estándar para hacer cálculos numéricos:

Operador Descripción Ejemplo
+ Suma 4 + 6 da como resultado 10
- Resta 15 - 10 da como resultado 5
* Multiplicación 2 * 3 da como resultado 6
Caution

Swift tiene tipado seguro y no permite mezclar distintos tipos numéricos en las operaciones aritméticas. No puedes sumar ni multiplicar directamente un Int y un Double; primero debes convertir uno de los tipos para que coincida con el otro.

División

El operador / realiza la división. Cuando ambos operandos son enteros, la división entera descarta cualquier residuo fraccionario:

5.0 / 2.0 // 2.5 (Double division)
5 / 2     // 2 (integer division truncates the remainder)

Dividir un número de punto flotante distinto de cero entre cero da como resultado inf o -inf. Dividir 0.0 entre 0.0 produce nan (no es un número). En cambio, dividir un entero entre cero provoca un error en tiempo de compilación o en tiempo de ejecución:

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

Operador de residuo

El operador de residuo (%) calcula el residuo que queda después de dividir dos enteros:

5 % 2  // 1
-5 % 2 // -1

// Dividing by zero produces an error:
// 5 % 0 // Error: Division by zero
Note

En Swift, % es un verdadero operador de residuo y no un operador de módulo. El resultado siempre toma el signo del primer operando (el dividendo), sin importar el signo del segundo operando:

5 % -2  // 1
-5 % 2  // -1

Redondeo de números de punto flotante

Puedes redondear un número de punto flotante con el método rounded(). Por defecto, rounded() redondea al entero más cercano. También puedes indicar una regla de redondeo específica, como .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

Inferencia de tipos

Cuando declaras una constante o una variable numérica sin una anotación de tipo, Swift infiere su tipo:

  • Los números enteros toman Int por defecto.
  • Los números con un punto decimal toman Double por defecto.
let x = 42         // Inferred as Int
let y = 42.0       // Inferred as Double
let z: Double = 42 // Explicitly typed as Double

Conversión de tipos

Para hacer operaciones entre valores de distintos tipos, convierte un valor con inicializadores de tipo como 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)

Instrucciones

En este ejercicio escribirás código para ayudar a un freelancer a comunicarse con sus clientes sobre los precios de ciertos proyectos. Escribirás algunas funciones de utilidad para calcular rápidamente los costos para los clientes.

1. Calcula la tarifa diaria a partir de una tarifa por hora

Un cliente contacta al freelancer para consultar sus tarifas. El freelancer explica que trabaja 8 horas al día. Sin embargo, el freelancer solo conoce su tarifa por hora del proyecto. Ayuda al freelancer a estimar una tarifa diaria a partir de una tarifa por hora.

Implementa la función dailyRateFrom(hourlyRate:), que recibe el argumento hourlyRate, el cual contiene la tarifa por hora del freelancer.
La función debe devolver la tarifa diaria a partir de la tarifa por hora.

dailyRateFrom(hourlyRate: 60)
// Returns 480.0

La tarifa diaria devuelta debe ser un Double.

2. Calcula la tarifa mensual a partir de una tarifa por hora y un descuento

A veces, un cliente está interesado en contratar al freelancer por un periodo más largo. El freelancer está dispuesto a darle un descuento al cliente, pero solo si el cliente lo contrata por al menos un mes. En total hay 22 días laborables. Ayuda al freelancer a calcular su tarifa mensual a partir de su tarifa por hora y el porcentaje de descuento sobre la tarifa fija que está dispuesto a otorgar, redondeado al número entero más cercano.

Implementa la función monthlyRateFrom(hourlyRate:withDiscount:), que recibe los argumentos hourlyRate, que contiene la tarifa por hora del freelancer, y withDiscount, que contiene el descuento que el freelancer está dispuesto a darle al cliente. La función debe devolver la tarifa mensual redondeada al número entero más cercano.

monthlyRateFrom(hourlyRate: 77, withDiscount: 10.5)
// Returns 12129

3. Calcula el número de días laborables a partir de un presupuesto, una tarifa por hora y un descuento

Otro día, un gerente de proyecto le ofrece al freelancer trabajar en un proyecto con un presupuesto fijo. Dado el presupuesto fijo y la tarifa por hora del freelancer, ayúdalo a calcular cuántos días trabajaría hasta que se agote el presupuesto. Ten en cuenta que en este escenario el freelancer siempre está dispuesto a dar el descuento, sin importar el número de días que se lo contrate. El resultado debe redondearse hacia abajo al número entero más cercano.

Implementa la función workdaysIn(budget:hourlyRate:withDiscount:), que recibe los argumentos:

  • budget, que contiene el presupuesto del proyecto.
  • hourlyRate, que contiene la tarifa por hora del freelancer.
  • withDiscount, que contiene el descuento que el freelancer está dispuesto a darle al cliente.

La función debe devolver el número de días laborables que el freelancer trabajará en el proyecto, redondeado hacia abajo.

workdaysIn(budget: 20000, hourlyRate: 80, withDiscount: 11.0)
// Returns 35.0
Editar en GitHub El enlace se abre en una ventana o una pestaña nuevas
Swift Exercism

¿Todo listo para empezar Tarifas de freelancer?

Regístrate en Exercism para aprender y dominar Swift con 35 conceptos116 ejercicios y mentoría humana real, todo gratis.