unwrap optionals from enum swift xcode enums optional

optionals - swift optional



¿Por qué Xcode me dice que agregue.map{$ 0.rawValue} cuando solo puedo hacer?.RawValue? (2)

La tercera respuesta de João Marcelo Souza es exactamente correcta. .map es el método opcional de desenvolvimiento seguro por excelencia . Enum(rawValue: "A").map{$0.rawValue} es Enum(rawValue: "A")?.rawValue .

El problema es simplemente que todos estamos tan acostumbrados a usar el segundo (azúcar sintáctica) que olvidamos que el primero es cómo piensa realmente el compilador Swift, bajo el capó.

Ejemplo:

var i : [Int]? = [7] i.map {$0.count} // 1 i?.count // 1 i = nil i.map {$0.count} // nil i?.count // nil

Tengo este codigo

enum Enum: String { case A = "A" } let s: String? = Enum(rawValue: "A")

Por supuesto, no se compila. Normalmente, lo arreglo de esta manera:

let s: String? = Enum(rawValue: "A")?.rawValue

Sin embargo, Xcode dice que debo agregar .map { $0.rawValue } :

Esto es extraño porque claramente, Xcode es consciente de que acceder a rawValue puede convertir a Enum en una String . Pero ¿por qué sugiere hacerlo usando el map ? ¿Por qué no acceder a él directamente?

Pensé que Xcode pensaría de esta manera:

Tengo una constante de cadena a la izquierda y una enumeración cuyo valor bruto es cadena. Los tipos no son compatibles, pero sé que rawValue puede convertir la enumeración en una cadena. Solo sugeriré al usuario que agregue ?.rawValue !

¿Cuál es el "proceso de pensamiento" de Xcode detrás de esto?

PS Mi intención aquí es comprobar si "A" es un valor bruto válido para una enumeración. Si es así, asignalo a s , de lo contrario asigna nil . Sé que esto no es muy práctico, pero solo me preocupa el comportamiento de Xcode.


No es específico de Enum . De hecho, todas las instancias Optional implementan la función de map :

let possibleNumber: Int? = Int("4") let possibleSquare = possibleNumber.map { $0 * $0 } print(possibleSquare) // Prints "Optional(16)"

No estoy seguro de por qué Xcode sugiere que en lugar de solo .rawValue pero puedo pensar en algunas posibles razones:

  1. Orden alfabetico.
  2. Es posible que desee realizar alguna operación en el valor sin envolver.
  3. Tal vez foo?.bar es solo azúcar de sintaxis para foo.map { $0.bar }