Tracks
/
Swift
Swift
/
Ejercicios
/
El ayudante Swifty de Santa
El ayudante Swifty de Santa

El ayudante Swifty de Santa

Ejercicio de aprendizaje

Introducción

Las tuplas agrupan varios valores en un único valor compuesto. A diferencia de los arrays, los valores de una tupla no necesitan compartir el mismo tipo, y el tamaño de una tupla es fijo una vez que se crea.

Para crear una tupla, encierra entre paréntesis valores separados por comas:

let order = ("biscuits", 2.99, 3)

También puedes especificar anotaciones de tipo de forma explícita:

let order: (String, Double, Int) = ("biscuits", 2.99, 3)

Para extraer elementos individuales de una tupla sin nombres, usa la sintaxis de índice que empieza en cero (.0, .1, etc.):

let item = order.0     // "biscuits"
let quantity = order.2 // 3

Tuplas con nombres

Puedes darle nombres a los elementos individuales de una tupla cuando la defines:

let order = (item: "biscuits", price: 2.99, quantity: 3)

Nombrar los elementos hace que el código sea más legible y te permite acceder a los elementos usando la notación de punto con sus etiquetas:

let item = order.item         // "biscuits"
let quantity = order.quantity // 3

También puedes incluir los nombres de los elementos en la anotación de tipo:

let order: (item: String, price: Double, quantity: Int) = (item: "biscuits", price: 2.99, quantity: 3)

Modificar tuplas

Si una tupla se declara como una variable (var), puedes actualizar sus elementos:

var order = ("biscuits", 2.99, 3)
order.0 = "cookies"
order.1 = 1.99
order.2 = 5

print(order)
// Prints ("cookies", 1.99, 5)

Devolver varios valores

Si bien las funciones de Swift solo pueden devolver un único valor, devolver una tupla te permite empaquetar y devolver varios valores desde una función:

func divide(_ dividend: Int, by divisor: Int) -> (quotient: Int, remainder: Int) {
    let quotient = dividend / divisor
    let remainder = dividend % divisor
    return (quotient, remainder)
}

let result = divide(14, by: 4)
print("Quotient: \(result.quotient), Remainder: \(result.remainder)")
// Prints "Quotient: 3, Remainder: 2"

Descomposición de tuplas

Puedes descomponer (desempaquetar) los valores de una tupla en constantes o variables separadas:

let order = ("biscuits", 2.99, 3)
let (item, price, quantity) = order

print(item) // Prints "biscuits"

La descomposición de tuplas también funciona directamente en los bucles for-in:

let orders = [("biscuits", 2.99, 3), ("cookies", 1.99, 5)]

for (item, price, quantity) in orders {
    print("Item: \(item), Price: \(price), Quantity: \(quantity)")
}

Instrucciones

Eres un elfo que trabaja en la división de logística de Santa Claus y el jefe te ha encargado un par de tareas para actualizar el software del sistema.

1. Obtener el nombre del juguete

El sistema necesita poder obtener el nombre de un juguete de la base de datos. La base de datos está hecha de tuplas de tipo (name: String, quantity: Int).

Implementa la función getName(_:), que recibe un argumento que contiene una tupla de tipo (name: String, quantity: Int).

let toy = (name: "Doll", quantity: 10)
getName(toy)
// Returns "Doll"

2. Agregar un nuevo juguete a la base de datos

El mercado de juguetes es un mercado rápido y cambiante; lo que es popular cambia muy rápido. Por eso se necesita una función que cree un nuevo juguete.

Implementa la función createToy(name:amount:), que recibe un argumento name que contiene el nombre del juguete y amount que contiene la cantidad del juguete.

createToy(name: "Doll", amount: 10)
// Returns (name: "Doll", amount: 10)

3. Actualizar la cantidad de un juguete

Los elfos en el taller de Santa están constantemente haciendo más juguetes, y Santa necesita llevar un registro de la cantidad de cada juguete. Para hacerlo, el sistema necesita poder actualizar la cantidad de un juguete en la base de datos.

Implementa la función updateQuantity(_:toy:Amount:), que recibe los argumentos:

  • toys, que contiene un array de tuplas de tipo (name: String, quantity: Int).
  • toy, que contiene el nombre del juguete a actualizar.
  • amount, que contiene la nueva cantidad del juguete.

Puedes asumir que el juguete ya está en la base de datos y no necesitas verificarlo.

let toys = [(name: "Doll", quantity: 10), (name: "Car", quantity: 5), (name: "Train", quantity: 3)]
updateQuantity(toys, toy: "Doll", amount: 15)
// Returns [(name: "Doll", quantity: 15), (name: "Car", quantity: 5), (name: "Train", quantity: 3)]

4. Agregar la clave de categoría a un juguete

Santa quiere poder categorizar los juguetes en la base de datos. Esto es para que puedan encontrar fácilmente los juguetes cuando necesiten hacer una entrega, y para poder ordenar los juguetes en la base de datos.

Sin embargo, cuando el sistema se implementó por primera vez, se olvidó la clave de categoría. Ahora el sistema necesita poder agregar una clave de categoría a un juguete en la base de datos.

Implementa la función addCategory(_:category:), que recibe los argumentos:

  • toys, que contiene un array de tuplas de tipo (name: String, quantity: Int).
  • category, que contiene la clave de categoría que se agregará a los juguetes.

Puedes asumir que el juguete ya está en la base de datos y no necesitas verificarlo. También puedes asumir que todavía no hay una clave de categoría en el juguete.

let toys = [(name: "Car", quantity: 5), (name: "Train", quantity: 3)]
addCategory(toys, category: "Vehicle")
// Returns [(name: "Car", quantity: 5, category: "Vehicle"), (name: "Train", quantity: 3, category: "Vehicle")]
Editar en GitHub El enlace se abre en una ventana o una pestaña nuevas
Swift Exercism

¿Todo listo para empezar El ayudante Swifty de Santa?

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