Búsqueda opcional
Parte de la sección Lógica y Flujo del Journey de Swift de Coddy — lección 13 de 56.
Los subíndices de los diccionarios siempre devuelven un Optional: el valor cuando la clave existe, nil cuando no. Swift te obliga a manejar ambos casos.
let prices: [String: Int] = ["apple": 1, "bread": 3]
let p = prices["apple"]
print(p) // Optional(1)Tres formas idiomáticas de lidiar con el optional. Elige la que mejor se adapte a la situación.
1. if let: maneja ambas ramas explícitamente:
if let p = prices["apple"] {
print("apple costs \(p)")
} else {
print("unknown")
}2. nil-coalescing ??: proporciona un valor de respaldo en la misma línea:
let p = prices["olive"] ?? 0 // 03. subíndice con valor predeterminado: resultado idéntico, pero el valor predeterminado también se mantiene si vuelves a escribir en esa clave:
var counts = ["a": 2]
counts["b", default: 0] += 1 // counts == ["a": 2, "b": 1]Desafío
FácilSe proporciona el diccionario prices. Lee una sola línea de entrada: una lista separada por comas de los artículos que el usuario desea comprar.
Para cada artículo, en el orden de entrada, búscalo en prices. Imprime una línea por artículo:
<item> @ <price>cuando el artículo está en el diccionario<item> not solden caso contrario
Después de listar cada artículo, imprime una línea final: Total: <sum>. Trata los artículos faltantes como si costaran 0 utilizando el operador de coalescencia nula (nil-coalescing operator).
Para la entrada apple,bread,olive,milk, la salida es:
apple @ 1
bread @ 3
olive not sold
milk @ 4
Total: 8Hoja de referencia
Los subíndices de los diccionarios devuelven un Optional — el valor si la clave existe, nil si no.
1. if let — maneja ambas ramas:
if let p = prices["apple"] {
print("apple costs \(p)")
} else {
print("unknown")
}2. Coalescencia nula ?? — proporciona una alternativa:
let p = prices["olive"] ?? 0 // 03. Subíndice con valor por defecto — alternativa que también funciona al escribir:
var counts = ["a": 2]
counts["b", default: 0] += 1 // ["a": 2, "b": 1]Pruébalo tú mismo
let prices: [String: Int] = ["apple": 1, "bread": 3, "milk": 4]
let items = readLine()!.components(separatedBy: ",")
// TODO: búsqueda por artículo; imprimir '@ precio' o 'no se vende'; sumar con ?? 0
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Lógica y Flujo
1Strings a fondo
Conteo e índicesMayúsculas, minúsculas y TrimBúsqueda en StringsDividir y unirReemplazo de subcadenasResumen: Validación de usuario4Conjuntos
Crear conjuntosUnión e intersecciónResta y diferencia simétricaSubconjunto y superconjuntoResumen - Filtro de etiquetas7Proyecto - Seguimiento de hábitos
Descripción general del proyectoMarcar como completado10Proyecto - Motor de cuestionarios
Descripción general del proyectoHacer preguntas2Rangos e Intervalos
Cerrados vs. SemiabiertosSaltos (Stride)Métodos de RangosRangos en SwitchResumen - Cuadrícula de calendario5Funciones de orden superior Pt. 1
MapFilterReduceEncadenar map, filter, reduceResumen - Estadísticas de palabras3Diccionarios
Declaración de diccionariosBúsqueda opcionalActualización de diccionariosIteración de diccionariosAgrupación de valoresResumen - Inventario6Funciones de orden superior - Parte 2
compactMapflatMapsorted(by:)Construcción de pipelinesRepaso - Tabla de posiciones