Unlimited WordPress themes, graphics, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Swift
Code

Belajar Swift dari Nol: Closure

by
Difficulty:BeginnerLength:MediumLanguages:
This post is part of a series called Swift From Scratch.
Swift From Scratch: Function Parameters, Types, and Nesting
Swift From Scratch: An Introduction to Classes and Structures

Indonesian (Bahasa Indonesia) translation by Kurniawan Sugi Purwanto (you can also view the original English article)

Jika Anda sudah bekerja dengan blok di C/Objective-C atau lambda di Ruby, makan Anda tidak akan kesulitan memahami konsep closure. Closure tidak lebih dari blok fungsionalitas yang bisa Anda  masukkan ke dalam kode Anda.

Kenyataannya, kita sudah bekerja dengan closure di dua artikel sebelumnya. Itu benar. Berbagai fungsi juga adalah closure. Mari mulai dengan yang dasar lalu menelusuri anatomi suatu closure.

1. Apa itu Closure?

Seperti yang saya sampaikan, closure adalah blok fungsionalitas yang bisa Anda masukkan di sekitar kode Anda. Anda bisa memasukkan closure sebagai argumen suatu fungsi atau Anda bisa menyimpannya sebagai properti suatu objek. Closure punya banyak contoh penggunaan.

Nama closure menunjukkan salah satu karakteristik kunci closure. Suatu closure menangkap variable dan konstanta konteks yang mendefinisikannya. Terkadang ini disebut sebagai closing over terhadap berbagai variabel dan konstanta. Kita akan melihat penangkapan nilai secara lebih detail di bagian akhir artikel ini.

Fleksibilitas

Anda sudah belajar bahwa fungsi bisa sangat kuat dan fleksibel. Karena fungsi juga closure, maka closure bersifat fleksibel. Dalam artikel ini, Anda akan menemukan betapa fleksibel dan canggih closure itu.

Manajemen Memori

Bahasa pemrograman C memiliki konsep yang serupa yakni blok. Akan tetapi di Swift closure memiliki sejumlah kecil kelebihan. Salah satu kunci kelebihan closure di Swift adalah bahwa manajemen memorinya adalah sesuatu yang tidak perlu dikhawatirka oleh Anda, para pengembang.

Bahkan mempertahankan siklus, yang tidak aneh di C/Objective-C, juga ditangani oleh Swift. Ini akan mengurangi kebocoran memori atau kerusakan yang susah ditemukan akibat pointer yang invalid.

2. Sintaks

Sintaks dasar suatu closure tidaklah sulit dan akan mengingatkan Anda akan fungsi nested dan global, yang telah kita bahas sebelumnya dalam seri ini. Lihat pada contoh berikut.

Hal pertama yang Anda dapati adalah bahwa keseluruhan closure dilingkupi dengan sepasang kurung kurawal. Parameter closure dilingkupi dengan sepasang tanda kurung. yang terpisah dari tipe return dengan simbol ->. Closure tersebut menerima satu argumen, a, dari tipe Int dan mengembalikan suatu Int. Badan closure dimulai setelah kata kunci in.

Dinamai closure, yakni fungsi global dan nested, kelihatannya sedikit berbeda. Contoh berikut mengilustrasikan perbedaannya.

Perbedaan paling utama adalah penggunaan kata kunci func dan posisi parameter serta tipe return. Suatu closure dimulai dan diakhiri dengan kurung kurawal, melingkupi parameter, tipe return, dan badan closure. Meskipun ada beberapa perbedaan tersebut, ingatlah bahwa tiap fungsi adalah closure. Meskipun tidak seluruh closure adalah fungsi.

3. Closure adalah Parameter

Closure itu sangat bagus dan contoh berikut mengilustrasikan seberapa bermanfaat closure. Dalam contoh ini kita membuat suatu array state. Kita memanggil fungsi map di array untuk membuat suatu array baru yang hanya mengandung dua huruf pertama tiap state sebagai string yang dikapitalisasi.

Fungsi atau metode map umum di banyak pustak dan bahasa pemrograman seperti Ruby, PHP, jQuery. Pada contoh di atas, fungsi map dipanggil di array states, mentransformasikan kontennya, dan mengembalikan array baru yang berisi nilai yang sudah ditransformasikan.

Inferensi Tipe

Sebelumnya di seri ini, kita belajar bahwa Swift cukup cerdas. Sekarang mari kita lihat secara tepat seberapa cerdas. Array state adalah suatu array string. Karena kita memanggil fungsi map di array, Swift tahu bahwa argumen state adalah bertipe String. Ini artinya kita bisa mengabaikan tipe yang ditunjukkan di contoh yang telah diperbarui di bawah ini.

Ada sejumlah hal lagi yang bisa diabaikan dari contoh di atas, yang menghasilkan kode satu baris berikut.

Akan saya jelaskan apa yang terjadi. Pengompilasi (compiler) bisa menyimpulkan bahwa kita mengembalikan suatu string dari closure yang dimasukkan ke fungsi map, artinya tidak ada alasan untuk memasukkannya ke definisi ekspresi closure. Kita hanya bisa melakukan ini jika badan closure mencakup satu statemen tunggal Dalam hal itu, kita bisa meletakkan statemen tersebut di baris yang sama dengan definisi closure, sebagaimana pada contoh di atas. Karena tidak ada tipe return di definisinya dan tidak ada simbol -> yang mendahului tipe return, kita bisa mengabaikan tanda kurung yang melingkupi parameter closure.

Nama Argumen Shorthand

Meskipun demikian tidak berhenti di sini. Kita bisa memanfaatkan nama argumen shorthand untuk lebih menyederhanakan lagi ekspresi closure di atas.  Ketika menggunakan suatu ekspresi closure yang sejalur, sebagaimana contoh di atas, kita bisa mengabaikan daftar parameter termasuk kata kunci in yang memisahkan parameter dari badan closure.

Di badan closure, kita merujuk ke argumen dengan menggunakan nama argumen sorthand yang Swift sediakan bagi kita. Argumen pertama dirujuk dengan $0, yang kedua dengan $1, dan sebagainya.

Di contoh yang telah diperbarui di bawah ini, saya telah mengabaikan daftar parameter dan kata kunci in, serta mengganti argumen state di badan closure dengan nama argumen shorthand $0. Statemen yang dihasilkan lebih singkat tanpa mengorbankan kemudahan dibaca.

Trailing Closure

Bahasa pemrograman Swift juga mendefinisikan konsep yang disebut sebagai trailing closure. Idenya sederhana. Jika Anda memasukkan closure ke argumen terakhir suatu fungsi, Anda bisa menempatkan closure tersebut di luar tanda kurung pemanggilan fungsi. Contoh berikut menampilkan cara kerjanya.

Jika satu-satunya argumen pemanggilan fungsi adalah closure, maka lebih mungkin lagi untuk mengabaikan tanda kurung pemanggila fungsi itu.

Perhatikan bahwa ini juga bisa dimanfaatkan untuk closure yang mengandung banyak statemen. Kenyataannya, itulah alasan utama trailing closure tersedia di Swift. Jika suatu closure panjang atau kompleks, dan merupakan argumen terakhir suatu fungsi, lebih baik menggunakannya untuk trailing closure sintaks.

4. Menangkap Nilai

Ketika menggunakan closure, Anda sering mendapati diri Anda menggunakan atau memanipulasi konstanta dan variabel closure yang mengelilingi konteks dalam badan closure. Ini mungkin dan sering disebut sebagai value capturing. Sederhana saja, ini artinya suatu closure bisa menangkap nilai konstanta dan variabel dari konteks yang mendefinisikannya. Pelajari contoh di bawah untuk lebih memahami tentang konsep value capturing.

Saya yakin Anda sepakat bahwa contoh di atas sedikit sedikit dibuat-buat, tetapi contoh itu sangat jelas menujukkan betapa bernilai dalam menangkap nilai dan ke di Swift mereka. Fungsi nested, changeToUppercase dan changeToLowercase, memiliki akses ke argumen-argumen fungsi luar, states dan juga variabel newStates dideklarasikan di fungsi luar. Akan saya jelaskan apa yang terjadi.

Fungsi changeCase menerima boolean sebagai argumen pertamanya dan suatu parameter variadik tipe String sebagai parameter keduanya. Fungsi ini mengembalikan suatu array string yang tersusun atas sejumlah string yang dimasukkan ke fungsi sebagai argumen kedua. Di badan fungsi, kita membuat array string yang bisa dimutasi, newStrings, yang di situ kita menyimpan string-string yang telah dimanipulasi.

Fungsi nested memutar ulang string-string yang dimasukkan ke fungsi changeCase dan mengubah kapitalisasi tiap stringnya. Sebagaimana bisa Anda lihat, fungsi-fungsi tersebut memiliki akses langsung ke string yang dimasukkan ke fungsi changeCase dan juga array newStrings, yang dideklarasikan dalam badan fungsi changeCase.

Kita mengecek nilai uppercase, memanggil fungsi yang tepat, dan mengembalikan array newStrings. Dua baris di akhir contoh mendemonstrasikan bagaimana fungsi changeCase bekerja.

Meskipun saya mendemonstrasikan menangkap nilai dengan fungsi, ingat bahwa tiap fungsi adalah closure. Dengan kata lain, aturan yang sama berlaku untuk closure yang tanpa nama.

Closure

Telah disebutkan beberapa kali dalam artikel ini, bahwa fungsi adalah closure. Ada tiga jenis closure:

  • fungsi global
  • fungsi nested
  • ekspresi closure

Fungsi-fungsi global seperti fungsi printIn di pustaka standar Swift, tidak menangkap nilai apapun. Kendatipun demikian, fungsi-fungsi nested memiliki akses ke dan bisa menangkap nilai konstanta dan nilai fungsi yang mendefinisikannya. Contoh sebelumnya mengilustrasikan konsep ini.

Ekspresi closure, dikenal juga sebagai closure tanpa nama, bisa menangkap nilai konstanta dan variabel konteks yang mendefinisikannya. Ini sangat mirip dengan fungsi nested.

Menyalin dan Mereferensikan

Suatu closure yang menangkap nilai variabel bisa mengubah nilai variabel tersebut. Swift cukup cerdas untuk mengetahui apakah harus menyalin atau mereferensikan nilai konstanta dan variabel yang ditangkapnya.

Para pengembang yang masih baru terhadap Swift dan punya sedikit pengalaman dengan bahasa pemrograman lainnya akan mendapat hadiah ini secara cuma-cuma. Meskipun demikian, ini adalah manfaat penting yang dipahami Swift tentang cara menangkap nilai yang digunakan di closure, dan sebagai hasilnya, bisa membantu kita menangani manajemen memori.

Pelajari Lebih Banyak Kursus Bahasa Pemrograman Swift Kami

Jika Anda tertarik membawa pembelajaran Swift Anda selangkah lebih maju, Anda bisa melihat kursus lengkap kami tentang pengembangan Swift.

Kesimpulan

Closure adalah konsep penting dan Anda akan sering menggunakannya di Swift. Closure memungkinkan Anda menulis kode yang fleksibel dan dinamis yang proses penulisannya mudah sekaligus mudah dipahami. Di artikel berikutnya, kita akan mengeksplorasi pemrograman berorientasi objek di Swift, mulai dari objek, struktur, dan kelas.

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.