Quais são algumas dicas para o código de golfe no Swift? Seu foco na segurança parece dificultar a prática do golfe, mas isso dá pequenas dicas e é ainda mais útil. Existem recursos no Swift que podem ajudá-lo a se destacar no code-golf em certos aplicativos?
Poste uma dica por resposta.
Respostas:
Gamas
Uma coisa que é realmente útil é criar intervalos usando o
...
ou..<
operadoresPor exemplo
Então, para obter os valores de 2 a 4 de uma matriz
Uso pratico
Usando
É 8 bytes menor que
fonte
for n in 0...3{print(a[n])}
não é válido?Encerramentos:
O uso de variáveis como manter uma função vs. usar uma função em si pode ajudar:
65 bytes:
66 bytes:
Pequena diferença aqui, mas mostrará mais em alguns quebra-cabeças.
Funções de encurtamento:
Observar o exemplo anterior me lembra algo. Às vezes, se você estiver usando uma função vezes suficientes, vale a pena renomeá-la:
Este:
Para isso:
Ou, na verdade, isso é melhor:
Dessa forma, você acabou de ligar
r("Hello World",8)
vez deString(repeating:"Hello World",count:8)
Deixando de fora as declarações de tipo:
Certa vez, criei um fechamento sem definir o tipo de argumento, criando assim uma resposta mais curta:
O compilador inferiu que
i
está emInt
.Crie matrizes da maneira rápida:
Se você precisar de uma matriz de
Ints
, use aRange
para criá-la:Isso faz o mesmo que:
Matrizes em vez de
If
ouSwitch
:Em vez de fazer isso:
Você provavelmente pode fazer isso:
Encurtar tipos:
Se você estiver usando muito a conversão de tipos, convém criar um alias de tipo:
Mapa:
Lembre-se de que muitas vezes você não precisa usar a
return
palavra - chave nomap
função.Executando o Swift Online:
Embora o Try It Online não suporte o SwiftIt agora !fonte
try
No Swift 2.xe acima, funções que tradicionalmente manipulavam erros passando um ponteiro para um
NSError
objeto como um parâmetro de função agorathrow
seu erro.Isso significa que isto:
agora se parece com:
Isso pode ser reduzido usando
try?
outry!
.try?
avaliará a expressão paranil
se um erro for lançado.try!
travará seu programa se um erro for lançado e deve ser usado apenas nos casos em que nunca haverá um erro.try?
etry!
salve pelo menos 13 bytes dodo-try-catch
loop. Observe que você também salva pelo menos mais um byte passando uma matriz vazia ([]
) para opções em vez denil
também.fonte
Reduzindo matrizes
A iteração
for-in loops
através de uma matriz para obter um valor único, como a soma dos elementos internos ou o produto de seus elementos, pode ser muito longo para ser simples. Você pode apenas usar oreduce()
método Alguns exemplos:Adicionando os elementos em uma matriz com
for-in
loops:pode ser simplificado para:
E obtendo o produto dos elementos dentro da matriz com loops de entrada:
também pode ser reduzido para:
fonte
**
função do que faria apenas chamandopow
manualmente?O operador ternário de Swift é muito conciso:
condition ? action : other
açãoSe a condição for verdadeira, faça uma coisa, se não, faça outra coisa.
Isso torna o
textColor
branco se o fundo for preto ou preto se o fundo for de outra cor.O operador coalescente nulo é ainda mais tenso:
a ?? b
Digamos que você esteja verificando o JSON para uma determinada chave para poder apresentar o valor da chave como texto do título. Se a chave não estiver presente (ou seja, o valor for nulo), queremos fornecer o texto padrão do título.
fonte
Enumeração
Você pode fazer a cadeia
forEach
deenumerated()
um tipo de coleção para obter uma referência ao objeto (ou tipo de valor) em uma coleção, bem como seu índice:ou
ou (
CountableClosedRange
sintaxe ainda mais curta )Impressões:
fonte
Substring
Às vezes, você pode salvar bytes recorrendo aos tipos Foundation em vez de usar tipos Swift puros. Compare o acesso a uma substring de um tipo
NSString
Swift vsString
:Mesmo com os 9 caracteres perdidos ao declarar
x
como umNSString
, você economiza mais 25 usando o tipo Foundation, uma vez quesubstringToIndex
assume umInt
como parâmetro paraNSString
vs umIndex
struct (String.CharacterView.Index
) para SwiftString
tipos .Devo observar que a disponibilidade dos tipos de fundação pode diferir em várias plataformas (OS X, Linux, etc). A maioria das aulas da Fundação está
NSUnimplemented
na versão de código aberto do Swift.fonte
.mapa()
Combinar
.map()
com a sintaxe de fechamento à direita pode aumentar os loops. Podemos colocar as coisas que queremos iterar em uma matriz e usá.map()
-las para executar alguma ação em cada elemento.Por exemplo, podemos
.map()
escrever essa castanha velha, Fizzbuzz, em uma linha.Fora do golfe,
.map()
pode ajudar a reduzir a repetição. Por exemplo, suponha que você tenha uma visão que precisa posicionar programaticamente. Você pode colocar as âncoras da exibição em uma matriz anônima e executá.map()
-la para definir cada restrição.isActive
como verdadeira, da seguinte maneira:fonte
forEach
no seu segundo exemplo?map
realmente deve ser usado para transformar o conteúdo de uma matriz, e não como um atalho de iteração. Nesse caso, você está descartando o resultado.Atribuições variáveis de golfe em estruturas de fluxo de controle usando tuplas
Considere que você deseja usar um
while
loop e deseja usar a mesma coisa na condição e no bloco a seguir. Então, uma atribuição embutida em uma tupla provavelmente ajudaria. Quanto mais longo o seu atributo, melhor! Considere isto (3 bytes mais curto):por cima disto:
Observe a
(i=k.count,i>0).1
parte, que é bastante interessante.Inspirado por uma das respostas de Herman Lauenstein .
fonte
Repetindo Strings
Infelizmente, o Swift não suporta multiplicação de String com
*
, da mesma forma Python. Um bom método que você pode usar éString(repeating:count:)
, mas infelizmente isso não é realmente golfe. Compare estas duas abordagens:e
O segundo é um par de bytes mais curto, mas isso não pode ser usado em um fechamento ... Melhor ainda, e também funciona em fechamentos:
E se eu fizer isso várias vezes? Bem, você pode usar
String.init()
. Agora, isso pode economizar muitos bytes. Por exemplo (68 bytes):em vez de (74 bytes):
ou (70 bytes):
Mas verifique se a sua String é longa o suficiente. Se você estiver usando
String(repeating:"abc",3)
, é muito melhor usá-lo"abcabcabc"
.fonte
Importar
Você pode substituir
import Foundation
comimport UIKit
para 5 bytes mais curto, como UIKit faz importação Foundation já.fonte