Estoy mirando las notas de Xcode 7.3 y noto este problema.
Los operadores ++ y - han quedado en desuso
¿Podría alguien explicar por qué está en desuso? Y estoy en lo cierto, en la nueva versión de Xcode ahora vas a usar en lugar de ++
esto x += 1
;
Ejemplo:
for var index = 0; index < 3; index += 1 {
print("index is \(index)")
}
++
--
operadores yRespuestas:
Una explicación completa aquí de Chris Lattner, el creador de Swift. Resumiré los puntos:
x += 1
for i = 0; i < n; i++ { ... }
Swift tiene mejores alternativas, comofor i in 0..<n { ... }
(el estilo C para el bucle también se está apagando )x - ++x
ofoo(++x, x++)
?Para aquellos interesados (y para evitar la pudrición de enlaces), las razones de Lattner en sus propias palabras son:
fuente
++
no existiera en los lenguajes de estilo C, nadie en su sano juicio miraría el diseño de Swift 3.0 y pensaría que un++
operador sería una buena adición.Me doy cuenta de que este comentario no responde la pregunta, sin embargo, puede haber personas que buscan una solución para mantener a estos operadores trabajando y tal solución se puede encontrar en la parte inferior. 😇
Yo personalmente prefiero
++
y--
operadores. No puedo estar de acuerdo con la opinión de que son difíciles o difíciles de manejar. Una vez que el desarrollador comprende lo que hacen estos operadores (y estamos hablando de cosas bastante simples), el código debe ser muy claro.En la explicación de por qué los operadores quedaron en desuso se menciona que su uso principal era en estilo C para bucles. No conozco a otros, pero personalmente no uso bucles de estilo C en absoluto y todavía hay muchos otros lugares o situaciones cuando
++
o--
operador es útil.También me gustaría mencionar que
varName++
devuelve un valor para que pueda usarse en elreturn
mientrasvarName += 1
que no.Para cualquiera de ustedes que deseen mantener a estos operadores trabajando aquí, la solución es:
fuente
return (x - 1)
para los operadores de postfix: en mi humilde opinión, es más limpio mantener la semántica que devuelven (una copia del) valor original en lugar de lo que obtienes si lo hacesx + 1 - 1
Int
, el resultado de(x + 1)
se desbordará, lo que interrumpirá la ejecución y, porresult - 1
lo tanto , ni siquiera se ejecutará. Otros tipos de datos como,Double
por ejemplo, se comportan de manera diferente, así que necesito investigar eso.defer
para esto también.defer { x += 1 }; return x
Apple ha eliminado el
++
y lo ha hecho mucho más simple con la otra forma tradicional.En lugar de
++
, necesitas escribir+=
.Ejemplo:
De manera similar para el operador de decremento
--
, debe escribir-=
Ejemplo:
por
for
bucles:Ejemplo de incremento:
En vez de
Puedes escribir:
Ejemplo de decremento:
Puedes escribir:
¡Espero que esto ayude!
fuente
+=
Estuve allí todo el tiempo.++i
y--i
?Chris Lattner ha ido a la guerra contra ++ y -. Él escribe: “El código que realmente utiliza el valor del resultado de estos operadores a menudo es confuso y sutil para un lector / mantenedor de código. Fomentan el código "demasiado complicado" que puede ser lindo, pero difícil de entender ... Si bien Swift tiene un orden de evaluación bien definido, cualquier código que dependiera de él (como foo (++ a, a ++)) sería indeseable incluso si estaba bien definido ... estos fallan la métrica de "si aún no los tuviéramos, ¿los agregaríamos a Swift 3?"
Apple quería mantener rápido un lenguaje limpio, claro, no confuso y directo al grano. Y por eso desaprobaron ++ y - palabra clave.
fuente
...for i in 0.stride(to: 10, by: 2)...
o...for i in (1...10).reverse()...
esta limpio ?!El
Fix-it feature
de Xcode da una respuesta clara a esto.Reemplazar
++ increment operator
con anticuadovalue += 1
(operador de mano corta) y-- decrement operator
convalue -= 1
fuente
Para Swift 4, puede restaurar los operadores
++
y--
como extensiones paraInt
y otros tipos. Aquí hay un ejemplo:Funciona de la misma manera para otros tipos, tales como
UIInt
,Int8
,Float
,Double
, etc.Puede pegar estas extensiones en un solo archivo en su directorio raíz, y estarán disponibles para su uso dentro de todos sus otros archivos allí.
He notado un par de votos negativos para mi respuesta aquí, casi tan pronto como la publiqué. Lo cual tomo como un desacuerdo filosófico, en lugar de criticar cómo funciona mi código. Funciona perfectamente, si lo revisas en un patio de recreo.
La razón por la que publiqué esta respuesta es porque no estoy de acuerdo con hacer que los lenguajes de programación de computadoras sean innecesariamente diferentes entre sí.
Tener muchas similitudes entre idiomas hace que sea más fácil para las personas aprender y cambiar de un idioma a otro.
Los desarrolladores normalmente usan varios lenguajes de programación, en lugar de solo uno. Y es una verdadera molestia cambiar de un idioma a otro, cuando no hay convenciones y no hay una estandarización común en todos los idiomas.
Creo que debería haber diferencias de sintaxis entre los idiomas solo tanto como sea necesario, y no más que esto.
fuente
Aquí hay una versión genérica de algunos de los códigos publicados hasta ahora. Expresaría las mismas preocupaciones que los demás: es una buena práctica no usarlos en Swift. Estoy de acuerdo en que esto podría ser confuso para quienes lean su código en el futuro.
Esto también se puede escribir como una extensión en el tipo numérico.
fuente
@discardableResult
a cada una de estas funciones para silenciar la advertencia sobre el valor de retorno no utilizado; de lo contrario, exactamente lo que estaba buscando.De los documentos :
fuente
Esto es definitivamente un inconveniente, ¿verdad?
fuente
Como nunca trabajas realmente con punteros en Swift, en mi opinión , tiene sentido eliminar los operadores
++
y--
. Sin embargo, si no puede vivir sin él, puede agregar estas declaraciones de operador Swift 5+ a su proyecto:fuente
En Swift 4.1 se podría lograr de esta manera:
Tenga en cuenta que a pesar de que esta solución es similar a las soluciones anteriores en esta publicación, ya no funcionan en Swift 4.1 y este ejemplo sí. También tenga en cuenta que cualquiera de los anteriores menciona que + = es un reemplazo para ++ simplemente no entiende completamente al operador ya que ++ combinado con la asignación son en realidad dos operaciones, por lo tanto, un acceso directo. En mi ejemplo:
var s = t++
hace dos cosas: asigna el valor de t a sy luego incrementa t. Si el ++ viene antes, son las mismas dos operaciones realizadas en orden inverso. En mi opinión, el razonamiento de Apple sobre por qué eliminar este operador (mencionado en respuestas anteriores) no es solo un razonamiento falso, sino que además creo que es una mentira y la verdadera razón es que no pudieron hacer que su compilador lo maneje. Les dio problemas en versiones anteriores, por lo que se dieron por vencidos. La lógica de "operador demasiado complicado de entender, por lo tanto eliminado" es obviamente una mentira porque Swift contiene operadores mucho más complicados y mucho menos útiles que no fueron eliminados. Además, la gran mayoría de los lenguajes de programación lo tiene. JavaScript, C, C #, Java, C ++ y muchos más. Los programadores lo usan felizmente. Para quien es demasiado difícil entender a este operador,La estrategia detrás de Swift es simple: Apple cree que el programador es tonto y, por lo tanto, debe ser tratado en consecuencia.
La verdad es que Swift, lanzado en septiembre de 2014, se suponía que ya estaría en otro lugar. Otros idiomas crecieron mucho más rápido.
Puedo enumerar muchos errores importantes en el lenguaje, desde serios: como matrices pegadas por valor y no por referencia, hasta molestas: las funciones de parámetros variables no pueden aceptar una matriz, que es la idea detrás de esto. No creo que a los empleados de Apple se les permita mirar otros lenguajes como Java, por lo que ni siquiera saben que Apple está a años luz de distancia. Apple podría haber adoptado Java como lenguaje, pero en estos días, el desafío no es la tecnología, sino el ego. Si hubieran abierto IntelliJ para escribir algo de Java, seguramente cerrarían su negocio entendiendo que en este punto, no pueden ponerse al día y nunca lo harán.
fuente