¿Cuáles son algunos consejos para jugar golf en código en Swift? Su enfoque en la seguridad parece dificultar el golf, pero eso hace pequeños consejos e incluso más útiles. ¿Hay alguna característica en Swift que pueda ayudarlo a sobresalir en code-golf en ciertas aplicaciones?
Por favor, publique un consejo por respuesta.
Respuestas:
Rangos
Una cosa que es realmente útil es crear rangos usando el
...
o..<
operadoresPor ejemplo
Entonces, para obtener los valores segundo a cuarto de una matriz
Uso práctico
Utilizando
Es 8 bytes más corto que
fuente
for n in 0...3{print(a[n])}
no es válido?Cierres:
El uso de variables que sostienen una función vs. el uso de una función en sí misma puede ayudar:
65 bytes:
66 bytes:
Pequeña diferencia aquí, pero mostrará más en algunos rompecabezas.
Funciones de acortamiento:
Mirar el ejemplo anterior me recuerda algo. A veces, si va a utilizar una función suficientes veces, vale la pena cambiarle el nombre:
Esta:
A esto:
O, en realidad, esto es mejor:
De esa manera solo llamas en
r("Hello World",8)
lugar deString(repeating:"Hello World",count:8)
Dejando de lado las declaraciones de tipo:
Una vez creé un cierre sin establecer el tipo de argumento, creando así una respuesta más corta:
El compilador dedujo que
i
está enInt
.Cree matrices de manera rápida:
Si necesita una matriz de
Ints
, use aRange
para crearla:Esto hace lo mismo que:
Matrices en lugar de
If
oSwitch
:En lugar de hacer esto:
Probablemente puedas hacer esto:
Acortar tipos:
Si usa mucho la conversión de tipos, es posible que desee crear un alias de tipo:
Mapa:
Recuerde que a menudo no necesita usar la
return
palabra clave enmap
función.Ejecutando Swift Online:
¡Aunque Try It Online no es compatible con SwiftIt ahora !fuente
try
En Swift 2.xy versiones posteriores, las funciones que tradicionalmente manejaban errores al pasar un puntero a un
NSError
objeto como parámetro de función ahorathrow
su error.Esto significa que esto:
ahora se ve así:
Esto se puede acortar usando
try?
otry!
.try?
evaluará la expresiónnil
si se produce un error.try!
bloqueará su programa si se produce un error, y solo debe usarse en casos en los que nunca se generará un error.try?
ytry!
guarde al menos 13 bytes deldo-try-catch
bucle. Tenga en cuenta que también guarda al menos un byte más pasando una matriz vacía ([]
) para las opciones en lugar denil
también.fuente
Matrices reductoras
La iteración a
for-in loops
través de una matriz para obtener un valor único, como la suma de los elementos dentro, o el producto de sus elementos, puede ser demasiado largo para lo simple que es en realidad. Puedes usar elreduce()
método. Algunos ejemplos:Sumando los elementos en una matriz con
for-in
bucles:se puede simplificar a:
Y obtener el producto de los elementos dentro de la matriz con bucles for-in:
también se puede reducir a:
fuente
**
función de lo que lo harías simplemente llamandopow
manualmente?El operador ternario de Swift es muy conciso:
condition ? action : other
acciónSi la condición es verdadera, haga una cosa, si no, haga otra.
Esto hace que el
textColor
blanco sea el fondo negro o el negro si el fondo es de otro color.El operador de fusión nula es aún más terser:
a ?? b
Supongamos que está comprobando JSON para una determinada clave para que pueda presentar el valor de la clave como texto de título. Si la clave no está presente (es decir, el valor es nulo), queremos dar el texto predeterminado del título.
fuente
Enumeración
Puede encadenar
forEach
desdeenumerated()
un tipo de colección para obtener una referencia al objeto (o tipo de valor) en una colección, así como su índice:o
o (
CountableClosedRange
sintaxis aún más corta )Huellas dactilares:
fuente
Subcadena
A veces, puede guardar bytes recurriendo a los tipos de Foundation en lugar de utilizar tipos puros de Swift. Compare el acceso a una subcadena de un tipo de
NSString
vs SwiftString
:Incluso con los 9 caracteres perdidos al declarar
x
como unNSString
, ahorras 25 más usando el tipo Foundation, ya quesubstringToIndex
toma unInt
como parámetro paraNSString
vs vsIndex
struct (String.CharacterView.Index
) para losString
tipos Swift .Debo señalar que la disponibilidad de los tipos de Foundation puede diferir en varias plataformas (OS X, Linux, etc.). La mayoría de las clases de Foundation están
NSUnimplemented
en la versión de código abierto de Swift.fuente
.mapa()
La combinación
.map()
con la sintaxis de cierre posterior puede ajustar los bucles for. Podemos poner las cosas que queremos iterar en una matriz, luego usar.map()
para realizar alguna acción en cada elemento.Por ejemplo, podemos usar
.map()
para escribir esa vieja castaña, Fizzbuzz, en una línea.Fuera del golf,
.map()
puede ayudar a reducir la repetición. Por ejemplo, suponga que tiene una vista que necesita posicionar mediante programación. Puede colocar los anclajes para la vista en una matriz anónima y ejecutarla.map()
para establecer cada restricción.isActive
en verdadero, de esta manera:fuente
forEach
en tu segundo ejemplo?map
realmente debería usarse para transformar el contenido de una matriz, y no como un acceso directo de iteración. En este caso, estás descartando el resultado.Asignaciones variables de golf en estructuras de control de flujo usando tuplas
Considere que desea usar un
while
bucle y desea usar lo mismo tanto en la condición como en el bloque a seguir. Entonces, una asignación en línea en una tupla probablemente ayudaría. ¡Cuanto más largo sea tu atributo, mejor! Considere esto (3 bytes más cortos):Más allá de esto:
Observe la
(i=k.count,i>0).1
parte, que es bastante interesante.Inspirado por una de las respuestas de Herman Lauenstein .
fuente
Cuerdas repetidas
Desafortunadamente, Swift no admite la multiplicación de cadenas con
*
Python. Un buen método que puede usar en su lugar esString(repeating:count:)
, pero desafortunadamente no es realmente golfista. Compare estos dos enfoques:y
El segundo es un par de bytes más corto, pero eso no se puede usar en un cierre ... Mejor aún, y también funciona en cierres:
¿Y si lo hago varias veces? Bueno, puedes usar
String.init()
. Ahora, esto puede ahorrar muchos bytes. Por ejemplo (68 bytes):en lugar de (74 bytes):
o (70 bytes):
Pero asegúrese de que su cadena sea lo suficientemente larga. Si está usando
String(repeating:"abc",3)
, es mucho mejor usarlo"abcabcabc"
en su lugar.fuente
Importar
Puede reemplazar
import Foundation
conimport UIKit
5 bytes más cortos, ya que UIKit ya importa Foundation.fuente