Was sind einige Tipps für Code-Golf in Swift? Sein Fokus auf Sicherheit scheint es schwierig zu machen, darin zu golfen, aber das macht kleine Tipps und noch nützlicher. Gibt es irgendwelche Funktionen in Swift, die dazu beitragen können, dass Swift in bestimmten Anwendungen eine herausragende Leistung im Codegolf erbringt?
Bitte posten Sie einen Tipp pro Antwort.
Antworten:
Bereiche
Eine Sache, die wirklich hilfreich ist, ist das Erstellen von Bereichen mit den Operatoren
...
oder..<
Beispielsweise
So erhalten Sie die 2. bis 4. Werte eines Arrays
Praktischer Nutzen
Verwenden
Ist 8 Bytes kürzer als
quelle
for n in 0...3{print(a[n])}
nicht gültig?Verschlüsse:
Die Verwendung von Variablen, die eine Funktion enthalten, im Vergleich zur Verwendung einer Funktion selbst kann helfen:
65 Bytes:
66 Bytes:
Kleiner Unterschied hier, aber es wird in einigen Rätseln mehr zeigen.
Kürzungsfunktionen:
Ein Blick auf das vorherige Beispiel erinnert mich an etwas. Wenn Sie eine Funktion oft genug verwenden, lohnt es sich manchmal, sie umzubenennen:
Dies:
Dazu:
Oder eigentlich ist das besser:
Auf diese Weise rufen Sie einfach an
r("Hello World",8)
anstattString(repeating:"Hello World",count:8)
Typdeklarationen weglassen:
Ich habe einmal einen Abschluss erstellt, ohne den Argumenttyp festzulegen, wodurch eine kürzere Antwort erstellt wurde:
Der Compiler hat abgeleitet, dass
i
inInt
.Erstellen Sie Arrays auf schnelle Weise:
Wenn Sie ein Array von benötigen
Ints
, verwenden Sie aRange
, um es zu erstellen:Das macht dasselbe wie:
Arrays anstelle von
If
oderSwitch
:Anstatt dies zu tun:
Sie können dies wahrscheinlich tun:
Typen kürzen:
Wenn Sie die Typkonvertierung häufig verwenden, möchten Sie möglicherweise einen Typalias erstellen:
Karte:
Denken Sie daran, dass Sie das
return
Schlüsselwort in dermap
Funktion häufig nicht verwenden müssen .Swift Online ausführen:
Obwohl Try It Online SwiftIt jetztnicht unterstützt!quelle
try
In Swift 2.x und höher haben Funktionen, die traditionell Fehler behandelt haben, indem ein Zeiger auf ein
NSError
Objekt als Funktionsparameter übergeben wurde, nunthrow
ihren Fehler.Dies bedeutet, dass dies:
sieht jetzt so aus:
Dies kann mit
try?
oder verkürzt werdentry!
.try?
wertet den Ausdruck aus,nil
wenn ein Fehler ausgegeben wird.try!
wird Ihr Programm zum Absturz bringen, wenn ein Fehler ausgelöst wird, und sollte nur in Fällen verwendet werden, in denen niemals ein Fehler ausgelöst wird.try?
undtry!
speichern Sie mindestens 13 Bytes aus derdo-try-catch
Schleife. Beachten Sie, dass Sie auch mindestens ein weiteres Byte speichern, indem Sie[]
anstelle vonnil
auch ein leeres Array ( ) für Optionen übergeben .quelle
Arrays reduzieren
Das
for-in loops
Durchlaufen eines Arrays, um einen einzelnen Wert zu erhalten, z. B. die Summe der enthaltenen Elemente oder das Produkt seiner Elemente, kann zu lang sein, als dass dies tatsächlich einfach wäre. Sie können einfach diereduce()
Methode verwenden. Einige Beispiele:Addieren der Elemente in einem Array mit
for-in
Schleifen:kann vereinfacht werden zu:
Und das Produkt der Elemente innerhalb des Arrays mit for-in-Schleifen erhalten:
kann auch reduziert werden auf:
quelle
**
Funktion deklarieren , als wenn Sie sie nurpow
manuell aufrufen würden ?Swifts ternärer Operator ist sehr knapp:
condition ? action : other
AktionWenn die Bedingung erfüllt ist, machen Sie eine Sache, wenn nicht, machen Sie etwas anderes.
Dies macht das
textColor
Weiß, wenn der Hintergrund schwarz ist, oder schwarz, wenn der Hintergrund eine andere Farbe hat.Der Null-Koaleszenz-Operator ist noch enger:
a ?? b
Angenommen, Sie überprüfen JSON auf einen bestimmten Schlüssel, damit Sie den Wert des Schlüssels als Titeltext darstellen können. Wenn der Schlüssel nicht vorhanden ist (dh der Wert ist null), möchten wir den Titel als Standardtext festlegen.
quelle
Aufzählung
Sie können Kette
forEach
vonenumerated()
auf einer Sammlung Typ eine Referenz auf das Objekt (oder Werttyp) in einer Sammlung zu erhalten, sowie seinen Index:oder
oder (noch kürzere
CountableClosedRange
Syntax)Drucke:
quelle
Teilzeichenfolge
Manchmal können Sie Bytes sparen, indem Sie auf Foundation-Typen zurückgreifen, anstatt reine Swift-Typen zu verwenden. Vergleiche den Zugriff auf einen Teilstring eines mit
NSString
einem Swift-String
Typ:Selbst wenn die 9 Zeichen durch die Deklaration
x
als verloren gehenNSString
, sparen Sie durch die Verwendung des Foundation-Typs 25 weitere Zeichen , da für Swift- TypensubstringToIndex
einInt
als Parameter fürNSString
vs anIndex
struct (String.CharacterView.Index
)String
verwendet wird.Ich sollte beachten, dass die Verfügbarkeit von Foundation-Typen auf mehreren Plattformen (OS X, Linux usw.) unterschiedlich sein kann. Die meisten Foundation-Klassen sind
NSUnimplemented
in der Open-Source-Version von Swift.quelle
.Karte()
In Kombination
.map()
mit der Trailing-Closure-Syntax können For-Loops verstärkt werden. Wir können die Dinge, die wir durchlaufen möchten, in ein Array einfügen und dann.map()
für jedes Element eine Aktion ausführen.Zum Beispiel können wir
.map()
diese alte Kastanie, Fizzbuzz, in eine Zeile schreiben.Außerhalb des Golfsports
.map()
können Sie Wiederholungen reduzieren. Angenommen, Sie haben eine Ansicht, die Sie programmgesteuert positionieren müssen. Sie können die Anker für die Ansicht in ein anonymes Array einfügen und darüber laufen.map()
lassen, um für jede Einschränkung den Wert.isActive
true festzulegen:quelle
forEach
in Ihrem zweiten Beispiel zu verwenden?map
sollte wirklich zum Transformieren des Inhalts eines Arrays und nicht als Iterationsverknüpfung verwendet werden. In diesem Fall verwerfen Sie das Ergebnis.Variablenzuweisungen in Kontrollflussstrukturen mit Hilfe von Tupeln ausführen
Stellen Sie sich vor, Sie möchten eine
while
Schleife verwenden, und Sie möchten sowohl in der Bedingung als auch im nachfolgenden Block dasselbe verwenden. Dann würde eine Inline-Zuweisung in einem Tupel höchstwahrscheinlich helfen. Je länger dein Attribut, desto besser! Betrachten Sie dies (3 Bytes kürzer):darüber:
Beachten Sie den
(i=k.count,i>0).1
Teil, der ziemlich interessant ist.Inspiriert von einer Antwort von Herman Lauenstein .
quelle
Saiten wiederholen
Leider unterstützt Swift nicht die String-Multiplikation mit
*
, ebenso Python. Eine gute Methode, die Sie stattdessen verwenden können, istString(repeating:count:)
, aber das ist leider nicht wirklich Golf. Vergleichen Sie diese beiden Ansätze:und
Das zweite ist ein paar Bytes kürzer, aber das kann nicht in einem Closure verwendet werden ... Besser noch, und es funktioniert auch in Closures:
Und wenn ich es mehrmals mache? Gut können Sie verwenden
String.init()
. Dies kann jetzt viele Bytes sparen. Zum Beispiel (68 Bytes):statt (74 Bytes):
oder (70 Bytes):
Aber stellen Sie sicher, dass Ihre Zeichenfolge lang genug ist. Wenn Sie verwenden
String(repeating:"abc",3)
, ist es viel besser,"abcabcabc"
stattdessen zu verwenden .quelle
Einführen
Sie können ersetzen
import Foundation
mitimport UIKit
5 Bytes kürzer, als UIKit Import Foundation hat bereits.quelle