Estoy intentando con estas líneas de código
class Student {
var name: String
var age: Int?
init(name: String) {
self.name = name
}
func description() -> String {
return age != nil ? "\(name) is \(age) years old." : "\(name) hides his age."
}
}
var me = Student(name: "Daniel")
println(me.description())
me.age = 18
println(me.description())
El código anterior produce lo siguiente
Daniel hides his age.
Daniel is Optional(18) years old.
Mi pregunta es por qué hay Opcional (18) allí, ¿cómo puedo eliminar el opcional y solo imprimir
Daniel is 18 years old.
if let age = age { return ""} else { return "" }
Many Swift beginners think var age: Int? means that age is an Int which may or may not have a value. But it means that age is an Optional which may or may not hold an Int.
Un opcional significa que Swift no está completamente seguro de si el valor corresponde al tipo: por ejemplo, Int? significa que Swift no está completamente seguro de si el número es un Int.
1) Si está absolutamente seguro del tipo, puede usar un signo de exclamación para forzarlo a desenvolverlo, así:
Si fuerza desenvolver un opcional y es igual a nulo, puede encontrar este error de bloqueo:
Esto no es necesariamente seguro, por lo que aquí hay un método que podría evitar fallas en caso de que no esté seguro del tipo y valor:
2) El opcional implícitamente desenvuelto
3) La declaración de guardia
Desde aquí, puede seguir adelante y usar la variable no envuelta. Asegúrese de forzar el desenvolvimiento (con un!), Si está seguro del tipo de variable.
fuente
Para fines de prueba / depuración, a menudo quiero generar opcionales como cadenas sin tener que probar siempre los
nil
valores, por lo que creé un operador personalizado.Mejoré las cosas aún más después de leer esta respuesta en otra pregunta .
Obviamente, el operador (y sus atributos) se puede ajustar a su gusto, o puede convertirlo en una función. De todos modos, esto le permite escribir código simple como este:
La integración de la idea del protocolo del otro tipo hizo que esto incluso funcionara con opcionales anidados, lo que a menudo ocurre cuando se usa el encadenamiento opcional. Por ejemplo:
fuente
String
en otro lugar (por ejemplo, un mensaje de registro / error).Actualizar
Simplemente use
me.age ?? "Unknown age!"
. Funciona en 3.0.2.Respuesta antigua
Sin forzar el desenvolvimiento (sin señal mach / crash si es nulo) otra buena forma de hacer esto sería:
(result["ip"] ?? "unavailable").description
.result["ip"] ?? "unavailable"
debería tener trabajo también, pero no lo hace, no en 2.2 al menosPor supuesto, reemplace "no disponible" con lo que más le convenga: "nulo", "no encontrado", etc.
fuente
Para desenvolver el uso opcional en
age!
lugar deage
. Actualmente está imprimiendo un valor opcional que podría sernil
. Es por eso que se envolvió conOptional
.fuente
En swift
Optional
es algo que puede sernil
en algunos casos. Si está 100% seguro de que avariable
tendrá algún valor siempre y no devolveránil
el complemento!
con la variable para forzar el desencadenamiento.En otro caso, si no está muy seguro del valor, agregue un
if let
bloque oguard
para asegurarse de que el valor exista, de lo contrario, puede provocar un bloqueo.Por
if let
bloque:por
guard
declaración:guard
es una estructura condicional para devolver el control si no se cumple la condición.Prefiero usar
guard
overif let
block en muchas situaciones, ya que nos permite devolver elfunction
si no existe un valor en particular. Como cuando hay una función donde una variable es integral para existir, podemos verificarla en la declaración de guardia y el retorno de ella no existe. es decir;Si la variable existe, podemos usar 'abc' en la función fuera del alcance de la guardia.
fuente
age
es de tipo opcional:Optional<Int>
por lo que si lo compara con nil, devuelve falso cada vez si tiene un valor o si no lo tiene. Necesita desenvolver el opcional para obtener el valor.En su ejemplo, no sabe si contiene algún valor, por lo que puede usar esto en su lugar:
fuente
Hice esto para imprimir el valor de la cadena (propiedad) desde otro controlador de vista.
ViewController.swift
SecondViewController.swift
Resultado:
fuente
Mira la
guard
declaración:fuente
Cuando tiene un valor predeterminado:
print("\(name) is \(age ?? 0) years old")
o cuando el nombre es opcional:
print("\(name ?? "unknown") is \(age) years old")
fuente
Obtenía el Opcional ("Cadena") en mis celdas de vista de tabla.
La primera respuesta es genial. Y me ayudó a resolverlo. Esto es lo que hice, para ayudar a los novatos como yo.
Dado que estoy creando una matriz en mi objeto personalizado, sé que siempre tendrá elementos en la primera posición, por lo que puedo forzar su desenvolvimiento en otra variable. Luego use esa variable para imprimir, o en mi caso, establezca el texto de la celda de la vista de tabla.
Parece tan simple ahora, pero me tomó un tiempo averiguarlo.
fuente
Esta no es la respuesta exacta a esta pregunta, pero sí una de las razones de este tipo de problema. En mi caso, no pude eliminar Optional de una Cadena con "if let" y "guard let".
Por lo tanto, use AnyObject en lugar de Any para eliminar opcional de una cadena en rápido.
Consulte el enlace para obtener la respuesta.
https://stackoverflow.com/a/51356716/8334818
fuente