Estoy usando Xcode 6 Beta 4. Tengo una situación extraña en la que no puedo encontrar la manera de probar adecuadamente las opciones.
Si tengo un xyz opcional, es la forma correcta de probar:
if (xyz) // Do something
o
if (xyz != nil) // Do something
Los documentos dicen que lo haga de la primera manera, pero he descubierto que a veces, la segunda forma es obligatoria y no genera un error del compilador, pero otras veces, la segunda genera un error del compilador.
Mi ejemplo específico es usar el analizador XML GData enlazado a swift:
let xml = GDataXMLDocument(
XMLString: responseBody,
options: 0,
error: &xmlError);
if (xmlError != nil)
Aquí, si acabo de hacer:
if xmlError
siempre volvería cierto. Sin embargo, si lo hago:
if (xmlError != nil)
entonces funciona (como funciona en Objective-C).
¿Hay algo con el XML de GData y la forma en que trata las opciones que me faltan?
Respuestas:
En Xcode Beta 5, ya no te permiten hacer:
Esto produce un error:
Tiene que usar uno de estos formularios:
fuente
Para agregar a las otras respuestas, en lugar de asignar a una variable con un nombre diferente dentro de una
if
condición:puede reutilizar el mismo nombre de variable como este:
Esto podría ayudarlo a evitar quedarse sin nombres de variables creativas ...
Esto aprovecha el sombreado variable que es compatible con Swift.
fuente
Una de las formas más directas de usar opcionales es la siguiente:
Suponiendo que
xyz
es de tipo opcional, comoInt?
por ejemplo.De esta forma, ambos pueden probar si
xyz
contiene un valor y, de ser así, trabajar inmediatamente con ese valor.Con respecto a su error de compilación, el tipo
UInt8
no es opcional (nota no '?') Y, por lo tanto, no se puede convertir anil
. Asegúrese de que la variable con la que está trabajando sea opcional antes de tratarla como tal.fuente
Swift 3.0, 4.0
Hay principalmente dos formas de marcar opcional para nil. Aquí hay ejemplos comparativos entre ellos.
1. si deja
if let
es la forma más básica de verificar opcional para nil. Se pueden agregar otras condiciones a esta comprobación nula, separadas por comas. La variable no debe ser nula para moverse para la siguiente condición. Si solo se requiere verificación nula, elimine las condiciones adicionales en el siguiente código.Aparte de eso, si
x
no es nulo, el cierre if se ejecutará yx_val
estará disponible dentro. De lo contrario, se activa el cierre de lo contrario.2. guardia let
guard let
puede hacer cosas similares Su objetivo principal es hacerlo lógicamente más razonable. Es como decir Asegúrese de que la variable no sea nula, de lo contrario, detenga la función .guard let
También puede hacer una comprobación adicional de la condición comoif let
.Las diferencias son que el valor sin envolver estará disponible en el mismo alcance que
guard let
, como se muestra en el comentario a continuación. Esto también conduce a tal punto que en el cierre de otra cosa, el programa tiene que salir del ámbito actual, porreturn
,break
, etc.fuente
De la guía de programación rápida
Entonces la mejor manera de hacer esto es
y si está utilizando la
xyz
instrucción in if. Entonces puede desenvolver laxyz
instrucción if en variable constante. Por lo tanto, no necesita desenvolver cada lugar en la instrucción if dondexyz
se utiliza.Esta convención es sugerida por
apple
y será seguida por los desarrolladores.fuente
if xyz != nil {...}
.Aunque todavía debe comparar explícitamente un opcional con
nil
o usar un enlace opcional para extraer adicionalmente su valor (es decir, los opcionales no se convierten implícitamente en valores booleanos), vale la pena señalar que Swift 2 ha agregado laguard
declaración para ayudar a evitar la pirámide de la fatalidad al trabajar con múltiples valores opcionales.En otras palabras, sus opciones ahora incluyen verificar explícitamente
nil
:Encuadernación opcional:
Y
guard
declaraciones:Observe cómo el enlace opcional ordinario puede conducir a una mayor sangría cuando hay más de un valor opcional:
Puede evitar este anidamiento con
guard
declaraciones:fuente
nil
valor accidentalmente , pero estoy de acuerdo en que la curva de aprendizaje es un poco empinada. :)Extensión de protocolo Swift 5
Aquí hay un enfoque que usa la extensión de protocolo para que pueda incorporar fácilmente una verificación nula opcional:
Uso
fuente
swift
análogo delpythonistas
que intenta mantener el lenguaje en alguna forma de pureza pitónica. ¿Mi toma? Acabo de levantar su código en mi mezcla de Utils.Ahora puede hacer rápidamente lo siguiente que le permite recuperar un poco del objetivo-c
if nil else
fuente
En lugar de
if
, el operador ternario puede ser útil cuando desea obtener un valor basado en si algo es nulo:fuente
xyz == nil
La expresión no funciona, perox != nil
funciona. No se porque.Otro enfoque además de usar
if
oguard
declaraciones para hacer el enlace opcional es extenderOptional
con:ifValue
recibe un cierre y lo llama con el valor como argumento cuando el opcional no es nulo. Se usa de esta manera:Probablemente debería usar un
if
oguard
sin embargo, ya que esos son los enfoques más convencionales (por lo tanto familiares) utilizados por los programadores de Swift.fuente
Una opción que no se ha cubierto específicamente es usar la sintaxis de valores ignorados de Swift:
Me gusta esto, ya que verificar si se
nil
siente fuera de lugar en un lenguaje moderno como Swift. Creo que la razón por la que se siente fuera de lugar es quenil
es básicamente un valor centinela. Hemos eliminado a los centinelas en casi cualquier otro lugar de la programación moderna, por lo quenil
parece que también debería irse.fuente
También puedes usar
Nil-Coalescing Operator
Si
optionalValue
es asínil
, automáticamente asigna valor adefaultValue
fuente
Esta prueba funcionó como se esperaba en todos los casos. Por cierto, no necesita los soportes
()
.fuente
if (xyz != nil)
.Si tiene condiciones y desea desenvolver y comparar, ¿qué tal si aprovecha la evaluación de cortocircuito de la expresión booleana compuesta como en
Por supuesto, esto no es tan legible como algunas de las otras publicaciones sugeridas, pero hace el trabajo y es algo sucinto que las otras soluciones sugeridas.
fuente