Las tuplas agrupan varios valores en un único valor compuesto. A diferencia de los arrays, los valores de una tupla no tienen que ser del mismo tipo, y el tamaño de una tupla es fijo una vez creada.
Para crear una tupla, escribe los valores separados por comas entre paréntesis:
let order = ("biscuits", 2.99, 3)
También puedes especificar las anotaciones de tipo de forma explícita:
let order: (String, Double, Int) = ("biscuits", 2.99, 3)
Para extraer elementos individuales de una tupla sin nombre, usa la sintaxis de índices que empieza en cero (.0, .1, etc.):
let item = order.0 // "biscuits"
let quantity = order.2 // 3
Puedes dar nombre a cada elemento de una tupla al definirla:
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 ellos con la notación de punto y 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)
Si una tupla se declara como 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)
Aunque 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"
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 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)")
}
Eres un elfo que trabaja en la división de logística de Papá Noel y el jefe te ha encargado un par de tareas para mejorar el software del sistema.
El sistema debe ser capaz de obtener el nombre de un juguete de la base de datos.
La base de datos está formada por 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"
El mercado de los juguetes es un mercado rápido y cambiante; lo que está de moda cambia muy deprisa. Por ello, se necesita una función que cree un juguete nuevo.
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)
Los elfos del taller de Papá Noel no dejan de fabricar juguetes, y Papá Noel necesita llevar un registro de la cantidad de cada juguete. Para ello, el sistema debe ser capaz de 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 que hay que actualizar.amount, que contiene la nueva cantidad del juguete.Puedes suponer que el juguete ya está en la base de datos y no hace falta que lo compruebes.
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)]
Papá Noel quiere poder categorizar los juguetes de la base de datos. Así puede encontrar fácilmente los juguetes cuando tiene que hacer una entrega y puede ordenarlos en la base de datos.
Sin embargo, cuando se implementó el sistema por primera vez, se olvidó la clave de categoría. Ahora el sistema debe ser capaz de añadir una clave de categoría a un juguete de 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 hay que añadir a los juguetes.Puedes suponer que el juguete ya está en la base de datos y no hace falta que lo compruebes. También puedes suponer que el juguete aún no tiene ninguna clave de categoría.
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")]
Regístrate en Exercism para aprender y dominar Swift con 35 conceptos116 ejercicios y mentoría humana real, todo gratis.