Quels sont les conseils pour jouer au golf à code dans Swift? Son accent sur la sécurité semble rendre difficile le golf, mais cela rend les petits conseils et encore plus utiles. Y a-t-il des fonctionnalités dans Swift qui peuvent l'aider à exceller dans le code-golf dans certaines applications?
Veuillez poster un pourboire par réponse.
Réponses:
Gammes
Une chose qui est vraiment utile est de créer des plages à l'aide des opérateurs
...
ou..<
Par exemple
Donc, pour obtenir les 2e à 4e valeurs d'un tableau
Utilisation pratique
En utilisant
8 octets de moins que
la source
for n in 0...3{print(a[n])}
N'est pas valide?Fermetures:
L'utilisation de variables qui détiennent une fonction par rapport à l'utilisation d'une fonction elle-même peut aider:
65 octets:
66 octets:
Petite différence ici, mais cela apparaîtra plus dans certains puzzles.
Fonctions de raccourcissement:
Regarder l'exemple précédent me rappelle quelque chose. Parfois, si vous utilisez une fonction suffisamment de fois, cela vaut la peine de la renommer:
Cette:
Pour ça:
Ou, en fait, c'est mieux:
De cette façon, vous appelez simplement
r("Hello World",8)
au lieu deString(repeating:"Hello World",count:8)
Laissant de côté les déclarations de type:
Une fois, j'ai créé une fermeture sans définir le type d'argument, créant ainsi une réponse plus courte:
Le compilateur déduit qui se
i
trouve dansInt
.Créez des tableaux rapidement:
Si vous avez besoin d'un tableau de
Ints
, utilisez aRange
pour le créer:Cela fait la même chose que:
Tableaux au lieu de
If
ouSwitch
:Au lieu de faire ceci:
Vous pouvez probablement faire ceci:
Raccourcir les types:
Si vous utilisez beaucoup la conversion de type, vous souhaiterez peut-être créer un alias de type:
Carte:
N'oubliez pas que vous n'avez souvent pas besoin d'utiliser le
return
mot - clé dans lamap
fonction.Exécuter Swift en ligne:
Bien que Try It Online ne prenne pas en charge Swift,il le fait maintenant !la source
try
Dans Swift 2.x et versions ultérieures, les fonctions qui géraient traditionnellement les erreurs en passant un pointeur sur un
NSError
objet en tant que paramètre de fonction deviennent désormaisthrow
leur erreur.Cela signifie que ceci:
ressemble maintenant à:
Cela peut être raccourci en utilisant
try?
outry!
.try?
évaluera l'expressionnil
si une erreur est levée.try!
plantera votre programme si une erreur est levée et ne doit être utilisé que dans les cas où il n'y aura jamais d'erreur levée.try?
ettry!
enregistrez au moins 13 octets de lado-try-catch
boucle. Notez que vous enregistrez également au moins un octet supplémentaire en passant un tableau vide ([]
) pour les options au lieu denil
.la source
Réduction des tableaux
Itérer avec à
for-in loops
travers un tableau pour obtenir une valeur unique telle que la somme des éléments à l'intérieur, ou le produit de ses éléments peut être trop long pour sa simplicité. Vous pouvez simplement utiliser lareduce()
méthode. Quelques exemples:Ajout des éléments dans un tableau avec des
for-in
boucles:peut être simplifié pour:
Et obtenir le produit des éléments à l'intérieur du tableau avec des boucles for-in:
peut également être réduit à:
la source
**
fonction que vous le feriez en appelant simplementpow
manuellement?L'opérateur ternaire de Swift est très concis:
condition ? action : other
actionSi la condition est vraie, faites une chose, sinon faites autre chose.
Cela rend le
textColor
blanc si l'arrière-plan est noir, ou noir si l'arrière-plan est d'une autre couleur.L'opérateur de coalescence nul est encore plus terser:
a ?? b
Supposons que vous vérifiez JSON pour une certaine clé afin de pouvoir présenter la valeur de la clé sous forme de texte de titre. Si la clé n'est pas présente (c'est-à-dire que la valeur est nulle), nous voulons donner le texte par défaut du titre.
la source
Énumération
Vous pouvez chaîner à
forEach
partirenumerated()
d'un type de collection pour obtenir une référence à l'objet (ou type de valeur) dans une collection, ainsi qu'à son index:ou
ou (
CountableClosedRange
syntaxe encore plus courte )Tirages:
la source
Sous-chaîne
Parfois, vous pouvez enregistrer des octets en retombant sur les types Foundation au lieu d'utiliser des types Swift purs. Comparez l'accès à une sous-chaîne de type
NSString
vs unString
type Swift :Même avec les 9 caractères perdus en déclarant
x
comme unNSString
, vous économisez 25 de plus en utilisant le type Foundation, carsubstringToIndex
prend unInt
comme paramètre pourNSString
, contre unIndex
struct (String.CharacterView.Index
) pour lesString
types Swift .Je dois noter que la disponibilité des types de Fondation peut différer sur plusieurs plates-formes (OS X, Linux, etc.). La plupart des classes Foundation sont
NSUnimplemented
dans la version open-source de Swift.la source
.carte()
La combinaison
.map()
avec la syntaxe de fermeture finale peut resserrer les boucles for. Nous pouvons mettre les choses que nous voulons itérer dans un tableau, puis utiliser.map()
pour effectuer une action sur chaque élément.Par exemple, nous pouvons utiliser
.map()
pour écrire ce vieux châtaignier, Fizzbuzz, sur une seule ligne.En dehors du golf,
.map()
peut aider à réduire les répétitions. Par exemple, supposons que vous ayez une vue que vous devez positionner par programme. Vous pouvez placer les ancres de la vue dans un tableau anonyme et les exécuter.map()
pour définir chaque contrainte.isActive
sur true, comme suit:la source
forEach
dans votre deuxième exemple?map
devrait vraiment être utilisé pour transformer le contenu d'un tableau, et non comme raccourci d'itération. Dans ce cas, vous rejetez le résultat.Affectations de variables de golf dans les structures de flux de contrôle à l'aide de tuples
Considérez que vous voulez utiliser une
while
boucle et que vous voulez utiliser la même chose à la fois dans la condition et dans le bloc à suivre. Ensuite, une affectation en ligne dans un tuple serait très probablement utile. Plus votre attribut est long, mieux c'est! Considérez ceci (3 octets plus court):sur ceci:
Remarquez la
(i=k.count,i>0).1
partie, qui est assez intéressante.Inspiré par l'une des réponses d' Herman Lauenstein .
la source
Répétition de chaînes
Malheureusement, Swift ne prend pas en charge la multiplication de chaînes avec
*
, de même que Python. Une bonne méthode que vous pouvez utiliser à la place estString(repeating:count:)
, mais malheureusement ce n'est pas vraiment du golf. Comparez ces deux approches:et
Le second est de quelques octets plus court, mais cela ne peut pas être utilisé dans une fermeture ... Mieux encore, et cela fonctionne également dans les fermetures:
Et si je le fais plusieurs fois? Eh bien, vous pouvez utiliser
String.init()
. Maintenant, cela peut économiser beaucoup d'octets. Par exemple (68 octets):au lieu de (74 octets):
ou (70 octets):
Mais assurez-vous que votre chaîne est suffisamment longue. Si vous utilisez
String(repeating:"abc",3)
, il est bien préférable d'utiliser à la"abcabcabc"
place.la source
Importation
Vous pouvez le remplacer
import Foundation
parimport UIKit
5 octets plus court, car UIKit importe déjà Foundation.la source