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:
- Orden alfabetico.
- Es posible que desee realizar alguna operación en el valor sin envolver.
- Tal vez
foo?.bar
es solo azúcar de sintaxis parafoo.map { $0.bar }