Suatu fungsi mengambil sejumlah masukan, melakukan sesuatu terhadapnya, dan menghasilkan keluaran. Suatu fungsi memiliki tanda tangan dan badan. Jika Anda memberikan masukan yang sama ke suatu fungsi maka Anda selalu mendapatkan keluaran yang sama. Itulah definisi singkat dari fungsi.

Sekarang kita akan membahas lebih banyak tentang fungsi dengan melihatnya lebih dekat. Kami akan menjelajahi fungsi tingkat tinggi di Swift. Fungsi yang mengambil fungsi lain sebagai masukan atau mengembalikan suatu fungsi disebutfungsi tingkat tinggi.

Di Swift, kami bermain dengan peta, filter, kurangi setiap hari. Saat kami menggunakan fungsi-fungsi ini, rasanya seperti ajaib. Pada titik ini, Anda mungkin tidak tahu apa yang terjadi di balik layar. Petakan, Filter, dan Kurangi pekerjaan melalui ide dan pendekatan pemrograman fungsional. Meskipun Swift bukan bahasa fungsional murni, Swift memungkinkan Anda melakukan hal-hal fungsional.

Sekarang mari kita lihat satu per satu apa yang terjadi di latar belakang mereka. Pertama kita akan mengimplementasikan versi dasar fungsi-fungsi ini untuk beberapa tipe data tertentu, kemudian kita akan mencoba mengimplementasikan versi generik.

Fungsi Peta

Katakanlah kita memiliki array bilangan bulat dan kita perlu menulis fungsi yang mengembalikan array baru setelah menambahkan beberapa nilai delta ke setiap elemen array asli. Kita dapat dengan mudah menulis fungsi untuk ini menggunakan perulangan for sederhana seperti di bawah ini:

Sekarang kita memerlukan fungsi lain yang mengembalikan array baru dengan menggandakan setiap elemen array asli. Untuk itu, kita bisa menerapkannya seperti di bawah ini:

Jika kita melihat kedua fungsi di atas, kita dapat menemukan bahwa keduanya pada dasarnya melakukan hal yang sama. Hanya fungsionalitas di dalam for loop yang berbeda. Keduanya menggunakan array Integer sebagai input, mentransformasi setiap elemen dengan menggunakan loop for, dan mengembalikan array baru. Jadi pada dasarnya yang utama adalah mengubah setiap elemen menjadi sesuatu yang baru.

Karena Swift mendukung fungsi tingkat tinggi, kita dapat menulis fungsi yang akan mengambil array bilangan bulat, mengubah fungsi tersebut sebagai input, dan mengembalikan array baru dengan menerapkan fungsi transformasi ke setiap elemen array asli.

Namun tetap saja, ada masalah dengan hal di atas: ia hanya mengembalikan array bilangan bulat. Misalnya, jika kita memiliki persyaratan untuk mengonversi array bilangan bulat masukan menjadi array string, maka kita tidak dapat melakukannya dengan fungsi ini. Untuk melakukan itu, kita perlu menulis fungsi generik yang berfungsi untuk tipe apa pun.

Kita dapat mengimplementasikan fungsi generik dalam ekstensi Array seperti ini:

  1. Deklarasikan fungsi peta dalam Ekstensi Array yang bekerja dengan tipe generik T.
  2. Fungsi ini mengambil fungsi bertipe (Element) -› Tsebagai masukan
  3. Deklarasikan array hasil kosong yang menampung data tipe T di dalam fungsi.
  4. Terapkan perulangan for itu sendiri dan panggil fungsi transformasi untuk mengonversi elemen menjadi tipe T
  5. Tambahkan nilai yang dikonversi dalam array yang dihasilkan

Beginilah cara fungsi peta bekerja di Swift. Jika kita perlu mengimplementasikan fungsi peta,maka kita akan mengimplementasikannya seperti di atas. Jadi pada dasarnya, ini tidak membuat keajaiban apa pun terjadi dalam sebuah array — kita dapat dengan mudah mendefinisikan fungsinya sendiri.

Fungsi Penyaring

Misalkan kita mempunyai array bilangan bulat dan kita hanya ingin menyimpan bilangan genap dalam array. Kita dapat mengimplementasikannya dengan menggunakan perulangan for sederhana:

Sekarang, katakanlah kita mempunyai array string yang mewakili nama file kelas suatu proyek dan kita hanya ingin menyimpan file .swift saja. Ini juga dapat dilakukan dengan satu putaran seperti di bawah ini:

Jika kita mencermati implementasi kedua fungsi di atas, maka kita dapat memahami bahwa pada dasarnya keduanya melakukan hal yang sama — hanya tipe datanya yang berbeda untuk kedua array tersebut. Kita dapat menggeneralisasikannya dengan mengimplementasikan fungsi filter umum, yang menggunakan array dan fungsi sebagai masukan, dan bergantung pada keluaran fungsi includeElement, fungsi ini memutuskan apakah akan menambahkan elemen dalam array yang dihasilkan.

Kurangi Fungsi

Misalkan kita memiliki array bilangan bulat dan kita ingin mengimplementasikan dua fungsi yang mengembalikan jumlah dan hasil kali elemen. Kita dapat mengimplementasikannya dengan menggunakan perulangan for sederhana:

Sekarang, alih-alih memiliki array bilangan bulat, katakanlah kita memiliki array string dan kita ingin menggabungkan semua elemen dalam array:

Ketiga fungsi tersebut pada dasarnya melakukan hal yang sama. Mereka mengambil array sebagai masukan, menginisialisasi variabel yang dihasilkan, mengulangi array, dan memperbarui variabel yang dihasilkan.

Dari sini kita dapat mengimplementasikan fungsi umum yang dapat digunakan untuk semua orang. Untuk melakukan ini kita memerlukan nilai awal dari variabel yang dihasilkan dan fungsi untuk memperbarui variabel tersebut di setiap iterasi.

Jadi kita bisa mengimplementasikan fungsi generik dengan definisi berikut:

Implementasi di atas bersifat umum untuk semua array input bertipe [Element]. Ini akan menghitung hasil tipe T. Agar dapat berfungsi, diperlukan nilai awal bertipe T untuk ditetapkan ke variabel yang dihasilkan. Kemudian, diperlukan fungsi bertipe (T, Element) -› Tyang akan digunakan di dalam perulangan for pada setiap iterasi untuk memperbarui variabel yang dihasilkan.

Terima kasih telah membaca!