Apa saja tips untuk bermain golf kode di Swift? Fokusnya pada keamanan tampaknya membuatnya sulit untuk bermain golf, tetapi itu membuat sedikit tips dan bahkan lebih bermanfaat. Apakah ada fitur di Swift yang dapat membantunya unggul dalam kode-golf pada aplikasi tertentu?
Silakan kirim satu tip per jawaban.
Jawaban:
Kisaran
Satu hal yang sangat membantu adalah membuat rentang menggunakan operator
...
atau..<
Sebagai contoh
Jadi, untuk mendapatkan nilai array 2 hingga 4
Penggunaan Praktis
Menggunakan
Lebih pendek 8 byte dari
sumber
for n in 0...3{print(a[n])}
tidak valid?Penutupan:
Penggunaan variabel fungsi terus vs menggunakan fungsi itu sendiri dapat membantu:
65 byte:
66 byte:
Perbedaan kecil di sini, tetapi akan lebih banyak muncul di beberapa teka-teki.
Fungsi Pemendekan:
Melihat contoh sebelumnya mengingatkan saya pada sesuatu. Kadang-kadang, jika Anda akan menggunakan suatu fungsi cukup kali, ada baiknya ruang untuk menamainya:
Ini:
Untuk ini:
Atau, sebenarnya, ini lebih baik:
Dengan begitu Anda hanya menelepon
r("Hello World",8)
sajaString(repeating:"Hello World",count:8)
Meninggalkan Jenis Deklarasi:
Saya pernah membuat penutupan tanpa menetapkan jenis argumen, sehingga menciptakan jawaban yang lebih pendek:
Kompilator menyimpulkan bahwa
i
ada diInt
.Buat Array dengan Cara Cepat:
Jika Anda membutuhkan array
Ints
, gunakan aRange
untuk membuatnya:Ini melakukan hal yang sama seperti:
Array Alih-alih
If
atauSwitch
:Alih-alih melakukan ini:
Anda mungkin dapat melakukan ini:
Mempersingkat jenis:
Jika Anda sering menggunakan konversi jenis, Anda mungkin ingin membuat alias jenis:
Peta:
Ingatlah bahwa Anda sering tidak perlu menggunakan
return
kata kunci dalammap
fungsi.Menjalankan Swift Online:
Meskipun Try It Online tidak mendukung SwiftIt tidak sekarang !sumber
try
Di Swift 2.x dan di atasnya, fungsi yang secara tradisional menangani kesalahan dengan meneruskan pointer ke
NSError
objek sebagai parameter fungsi sekarangthrow
kesalahan mereka.Ini berarti bahwa ini:
sekarang terlihat seperti:
Ini dapat disingkat dengan menggunakan
try?
atautry!
.try?
akan mengevaluasi ekspresinil
jika ada kesalahan.try!
akan membuat crash program Anda jika ada kesalahan, dan hanya akan digunakan jika tidak ada kesalahan yang terjadi.try?
dantry!
simpan setidaknya 13 byte darido-try-catch
loop. Perhatikan bahwa Anda juga menyimpan setidaknya satu byte lagi dengan meneruskan array kosong ([]
) untuk opsi alih-alihnil
.sumber
Mengurangi Array
Iterasi dengan
for-in loops
melalui array untuk mendapatkan nilai tunggal seperti jumlah elemen di dalam, atau produk elemennya mungkin terlalu lama untuk seberapa sederhana sebenarnya. Anda bisa menggunakanreduce()
metode ini. Beberapa contoh:Menambahkan elemen dalam array dengan
for-in
loop:dapat disederhanakan untuk:
Dan mendapatkan produk dari elemen-elemen di dalam array dengan for-in loop:
juga dapat direduksi menjadi:
sumber
**
fungsinya daripada hanya dengan meneleponpow
secara manual?Operator ternary Swift sangat singkat:
condition ? action : other
aksiJika kondisinya benar, lakukan satu hal, jika tidak, lakukan sesuatu yang lain.
Ini membuat
textColor
putih jika latar belakangnya hitam, atau hitam jika latar belakangnya adalah warna lain.Operator penggabungan nihil bahkan lebih sulit:
a ?? b
Katakanlah Anda sedang memeriksa JSON untuk kunci tertentu sehingga Anda dapat menyajikan nilai kunci sebagai teks judul. Jika kunci tidak ada (yaitu nilainya nihil), kami ingin memberikan teks judul default.
sumber
Pencacahan
Anda dapat menghubungkan
forEach
darienumerated()
pada tipe koleksi untuk mendapatkan referensi ke objek (atau tipe nilai) dalam koleksi, serta indeksnya:atau
atau (
CountableClosedRange
sintaks lebih pendek )Cetakan:
sumber
Substring
Kadang-kadang, Anda dapat menyimpan byte dengan jatuh kembali ke tipe Foundation daripada menggunakan tipe Swift murni. Bandingkan mengakses substring dari
NSString
vsString
tipe Swift :Bahkan dengan 9 karakter yang hilang dengan mendeklarasikan
x
sebagaiNSString
, Anda menyimpan 25 lebih banyak dengan menggunakan tipe Foundation, karenasubstringToIndex
mengambil sebagaiInt
sebagai parameter untukNSString
, vs sebuahIndex
struct (String.CharacterView.Index
) untukString
tipe Swift .Saya harus mencatat bahwa ketersediaan tipe Foundation mungkin berbeda di beberapa platform (OS X, Linux, dll). Sebagian besar kelas Foundation
NSUnimplemented
dalam versi open-source dari Swift.sumber
.peta()
Menggabungkan
.map()
dengan sintaks trailing closure dapat memperketat for-loop. Kita bisa meletakkan hal-hal yang ingin kita iterate ke dalam array, lalu gunakan.map()
untuk melakukan beberapa tindakan pada setiap elemen.Sebagai contoh, kita dapat menggunakannya
.map()
untuk menulis berangan tua itu, Fizzbuzz, dalam satu baris.Di luar golf,
.map()
dapat membantu mengurangi pengulangan. Sebagai contoh, misalkan Anda memiliki pandangan yang Anda butuhkan untuk memposisikan secara terprogram. Anda dapat menempatkan jangkar untuk tampilan ke dalam array anonim dan menjalankannya.map()
untuk mengatur setiap kendala.isActive
menjadi benar, seperti:sumber
forEach
contoh kedua Anda?map
harus benar-benar digunakan untuk mengubah konten array, dan bukan sebagai pintasan iterasi. Dalam hal ini, Anda membuang hasilnya.Penempatan variabel golf dalam struktur aliran kontrol menggunakan tupel
Pertimbangkan Anda ingin menggunakan
while
loop, dan Anda ingin menggunakan hal yang sama di kedua kondisi dan blok untuk diikuti. Kemudian, penugasan sebaris dalam tuple kemungkinan besar akan membantu. Semakin lama atribut Anda, semakin baik! Pertimbangkan ini (lebih pendek 3 byte):lebih dari ini:
Perhatikan
(i=k.count,i>0).1
bagian yang cukup menarik.Terinspirasi oleh salah satu jawaban Herman Lauenstein .
sumber
String berulang
Sayangnya, Swift tidak mendukung perkalian String dengan
*
, juga Python. Metode yang baik yang bisa Anda gunakan adalahString(repeating:count:)
, tetapi sayangnya itu tidak terlalu golf. Bandingkan dua pendekatan ini:dan
Yang kedua adalah beberapa byte lebih pendek, tetapi itu tidak dapat digunakan dalam penutupan ... Lebih baik lagi, dan itu juga bekerja dalam penutupan:
Dan bagaimana jika saya melakukannya berkali-kali? Nah, Anda bisa menggunakannya
String.init()
. Sekarang, ini dapat menghemat banyak byte. Misalnya (68 byte):alih-alih (74 byte):
atau (70 byte):
Tapi pastikan String Anda cukup panjang. Jika Anda menggunakan
String(repeating:"abc",3)
, lebih baik menggunakan"abcabcabc"
saja.sumber
Impor
Anda dapat mengganti
import Foundation
denganimport UIKit
untuk 5 byte lebih pendek, karena UIKit sudah mengimpor Yayasan.sumber