() translation by (you can also view the original English article)
Untuk melakukan segala sesuatu di Swift, Anda harus belajar seluk beluk fungsinya. Di Swift, fungsi-fungsi sangatlah bermanfaat dan fleksibel. Dasarnya sederhana—terutama jika Anda pernah bekerja dengan bahasa-bahasa pemrograman lainnya—tapi karena sintaks Swift yang fleksibel, hal itu bisa dengan cepat menjadi kompleks jika Anda tidak akrab dengan dasar-dasarnya.
Di artikel ini, kami akan berfokus pada dasar-dasarnya terlebih dahulu dan menjelajahi sintaks yang lebih kompleks dan contoh-contoh kasus di artikel berikutnya. Penting bagi Anda untuk tidak mengabaikan hal-hal dasar karena penting untuk memahami dari mana asal kekuatan suatu fungsi di Swift. Mari memulai dengan suatu contoh untuk membedah anatomi fungsi di Swift.
1. Belajar dengan Contoh
Sebuah fungsi tidak lebih dari satu blok kode yang bisa dieksekusi kapan saja dibutuhkan. Saya ingin memulai dengan contoh untuk membahas anatomi dasar suatu fungsi Swift. Nyalakan Xcode dan buat satu tempat bermain baru. Tambahkan definisi fungsi berikut ke taman bermainnya.
1 |
func printHelloWorld() { |
2 |
println("Hello World!") |
3 |
}
|
Suatu fungsi diawali dengan kata kunci func
dan diikuti dengan nama fungsinya, misalnya printHelloWorld.
Sebagaimana di banyak bahasa pemrograman lainnya, nama fungsi diikuti dengan sepasang tanda kurung yang berisi parameter-parameter fungsi, input untuk fungsi tersebut.
Badan fungsi tersebut diawali dan diakhiri dengan sepasang kurung kurawal. Fungsi printHelloWorld
mengandung satu pernyataan yang dengannya kita mencetak string Hello.World!
di keluaran standar. Beginilah penampakan fungsi dasar di Swift. Sintaksnya sederhana, bersih, dan minimalis.
Anda bisa menjalankan fungsi dengan mengetik nama fungsi, diikuti dengan sepasang tanda kurung.
1 |
printHelloWorld() |
2. Parameter
Mari kita jadikan contoh di atas sedikit lebih kompleks dengan menambahkan parameter ke definisi fungsi. Mudah saja, ini berarti menambahkan nilai input ke fungsi yang dimaksud yang bisa digunakannya di badan fungsi. Di contoh berikut, kita mendefinisikan fungsi printMessage
, yang menerima satu parameter, message
, dari tipe String
.
1 |
func printMessage(message: String) { |
2 |
println(message) |
3 |
}
|
Suatu fungsi bisa menerima beberapa nilai parameter atau input. Parameter tersebut dibungkus oleh kurung kurawal yang mengikuti nama fungsi. Nama parameter tersebut diikuti dengan tanda titik dua dan tipe parameter. Sebagaimana Anda ingat, ini sangat mirip dengan mendekalarasikan suatu variabel atau konstanta. Di sini dikatakan bahwa parameter message
adalah dari type String
.
Bukannya mencetak string hard-coded seperti yang kita lakukan di fungsi printHelloWorld
, kita mencetak nilai parameter message
. Ini menjadikan fungsinya fleksibel dan lebih bermanfaat.
Memanggil fungsi ini sangat mirip dengan yang sudah kita lihat sebelumnya. Perbedaannya hanyalah cara kita melewatkan argumen ketika menggunakan fungsi tersebut.
1 |
printMessage("Hello World!") |
Perhatikan bahwa istilah parameter dan argumen sering digunakan secara bertukar, tetapi ada perbedaan yang halus dan semantik di Swift. Di Swift, parameter adalah nilai yang ditentukan di definisi fungsi sedangkan argumen adalah nilai yang dilewatkan ke fungsi ketika fungsinya dipanggil.
Banyak Parameter
Sebagaimana saya sebutkan sebelumnya, fungsi sintaks sangat fleksibel dan semestinya tidak mengejutkan Anda bahwa sangat memungkinkan untuk melewatkan multi argumen ke suatu fungsi. Di contoh berikut, kami membuat variasi fungsi printMessage
yang memungkinkan kami mencetak pesan berkali-kali.
1 |
func printMessage(message: String, times: Int) { |
2 |
for i in 0..<times { |
3 |
println("\(i) \(message)") |
4 |
}
|
5 |
}
|
Meskipun nama fungsinya identik dengan fungsi aslinya printMessage
, tipe fungsinya berbeda. Penting bagi Anda untuk memahami kalimat sebelumnya. Baca lagi.
Tiap fungsi memiliki tipe, yang terdiri atas tipe-tipe parameter dan tipe return. Akan kita jelajahi tipe-tipe return sebentar lagi. Fungsi bisa memilliki nama yang sama selama tipenya berbeda sebagaimana ditunjukkan di dua definisi fungsi sebelumnya.
Tipe fungsi pertama adalah (String) -> ()
sedangkan tipe fungsi kedua adalah (String, Int) -> ()
. Nama kedua fungsi tersebut sama. Jangan khawatir dengan simbol ->
. Arti tanda itu akan jelas beberapa saat lagi, ketika kita membahas tipe-tipe return.
Fungsi printMessage
kedua mendefinisikan dua parameter, message
dari tipe String
dan times
tipe Int
. Definisi ini mengilustrasikan salah satu fungsi yang diadopsi Swift dari Objective-C, nama metode/fungsi nama yang bisa dibaca. Meskipun nama fungsinya adalah printMessage
, dengan membaca nama parameter fungsi, mudah untuk dipahami tentang apa yang seharusnya dilakukan oleh fungsi tersebut.
Di fungsi printMessage
yang kedua, kita membuat loop for-in
untuk mencetak string message
times kali
. Kita menggunakan operator kisaran setengah terbuka, ..<
, sebagaimana kita saksikan sebelumnya di seri ini.



Ketika kita mulai mengetik printMessage
di taman bermain, Xcode menampilkan kedua fungsi di menu autocompletion. Berkat tipe fungsi, mudah saja memilih fungsi apa yang kita tertarik padanya. Memanggil fungsi printMessage
kedua mudah saja seperti:
1 |
printMessage("Hello World", 3) |
Nilai Default
Salah satu fitur favorit saya adalah kemampuan mendefinisikan nilai untuk parameter. Ini mungkin kedengarannya bodoh jika Anda datang dari bahasa yang sudah cukup lama memiliki fitur ini, tetapi cukup hebat jika Anda sudah bekerja dengan C dan Objective-C selama bertahun-tahun.
Singkat saja, Swift mengizinkan para developer untuk mendefinisikan nilai default bagi parameter suatu fungsi. Mari mendefinisikan fungsi baru yang akan mencetak tanggal saat ini ke format khusus. Pastikan Anda menambahkan pernyataan impor berikut di taman bermain Anda untuk mengimpor kerangka kerja UIKit.
1 |
import UIKit |
Sebelumnya mari mendefinisikan fungsi printDate
tanpa menggunakan nilai default untuk tiap parameternya.
1 |
func printDate(date: NSDate, format: String) { |
2 |
let dateFormatter = NSDateFormatter() |
3 |
dateFormatter.dateFormat = format |
4 |
println(dateFormatter.stringFromDate(date)) |
5 |
}
|
Jika Anda tidak akrab dengan kerangka kerja Foundation dan Anda tidak memahami apa yang terjadi di badan fungsi, itu tidak masalah. Fokus contoh ini bukanlah implementasi pemformatan tanggal. Di printDate
, kita menggunakan nilai parameter format
untuk memformat nilai date
. Jika kita tidak melewatkan nilai untuk parameter format
, Swift akan memberitahu kita dengan melempar suatu pesan kesalahan



Kita bisa memperbaikinya dengan mendefinisikan suatu nilai default untuk parameter kedua fungsi sebagaimana ditunjukkan di definisi fungsi yang telah diperbarui di bawah ini.
1 |
func printDate(date: NSDate, format: String = "YY/MM/dd") { |
2 |
let dateFormatter = NSDateFormatter() |
3 |
dateFormatter.dateFormat = format |
4 |
println(dateFormatter.stringFromDate(date)) |
5 |
}
|
Mendefinisikan nilai default bisa dilakukan semudah menentukan nilai di daftar parameter di definisi fungsi. Hasilnya, Swift tidak akan lagi mengeluh dan pesan kesalahannya menghilang.
1 |
printDate(NSDate()) |
Bagaimana jika kita memang ingin memasukkan nilai untuk parameter format
? Mari kita coba dan lihat apa yang Swift katakan untuk kita.



Karena parameter format
memiliki nilai default dan oleh karenanya bersifat opsional, kita harus memasukkan nama argumen untuk memberitahu Swift parameter apa yang kita maksudkan. Cara memperbaikinya sangat mudah, seperti Anda lihat di bawah ini.
1 |
printDate(NSDate(), format: "dd/MM/YY") |
Perhatikan bahwa Apple merekomendasikan untuk memosisikan parameter dalam nilai default di akhir daftar parameter. Ini sungguh ide yang bagus dan umum di kebanyakan bahasa pemrograman lainnya yang mendukung parameter-parameter opsional.
3. Tipe Return
Fungsi-fungsi yang telah kita lihat sejauh ini tidak mengembalikan (return) apapun bagi kita ketika dipanggil. Mari membuat fungsi printDate
lebih bermanfaat dengan mengembalikan tanggal yang sudah diformat sebagai string, bukannya mencetak tanggal yang sudah diformat dalam fungsi. Dibutuhkan dua perubahan sebagaimana Anda lihat di bawah ini.
1 |
func printDate(date: NSDate, format: String = "YY/MM/dd") -> String { |
2 |
let dateFormatter = NSDateFormatter() |
3 |
dateFormatter.dateFormat = format |
4 |
return dateFormatter.stringFromDate(date) |
5 |
}
|
Hal pertama yang kita ubah adalah definisi fungsinya. Setelah daftar parameter, kita akan menentukan tipe return, String
. Tipe return diawali dengan tanda ->
. Jika Anda pernah bekerja dengan CoffeeScript, ini akan terlihat akrab.
Alih-alih mencetak tanggal terformat dengan fungsi printIn
, kita menggunakan kata kunci return
untuk mengembalikan nilai dari fungsi tersebut. Itulah yang harus kita lakukan. Mari dicoba.
1 |
let formattedDate = printDate(NSDate(), format: "dd/MM/YY") |
2 |
|
3 |
println(formattedDate) |
Kita memanggil fungsi printDate
, menyimpan nilai yang dikembalikan dalam konstanta formattedDate
, dan mencetak nilai formattedDate
dalam keluaran standar. Perhatikan bahwa nama printDate
tidak lagi mencerminkan apa yang dilakukannya, jadi Anda mungkin ingin menggatinya jadi formatDate
.
Tidak Ada Tipe Return
Fungsi-fungsi lain yang telah kita definisikan di tutorial ini tidak punya tipe return. Ketika suatu fungsi tidak punya tipe return, tidak penting untuk menambahkan simbol ->
ke definisi fungsinya.
Di beberapa paragraf sebelumnya, saya beritahu Anda bahwa tak satupun fungsi yang telah kita definisikan akan mengembalikan suatu nilai. Sebenarnya itu tidak sepenuhnya benar. Izinkan saya menjelaskan perincian yang fundamental ini dengan suatu eksperimen. Tambahkan baris berikut ke taman bermain Anda dan lihat apa yang terjadi.



Ini menarik. Swift tidak mempermasalahkan kita menyimpan nilai kembalian fungsi printHelloWorld
dalam suatu konstanta, tetapi dia mengeluhkan ketidakmampuannya menyimpulkan tipe konstanta value
.
Apa yang terjadi di sini? Tiap fungsi di Swift mengembalikan suatu nilai, meskipun kita tidak mendefinisikan tipe return di definisi fungsinya. Ketika suatu fungsi tidak secara eksplisit menentukan tipe return, fungsinya secara implisit mengembalikan Void
, yang setara dengan sebuah tupel kosong, atau singkatnya ()
. Anda bisa melihat ini di panel keluaran taman bermain sebagaimana ditampilkan di screenshot di atas.
Kita bisa membuang peringatan di atas dengan secara eksplisit mendeklarasikan tipe value
, suatu tupel kosong. Saya setuju bahwa menyimpan tupel kosong tidak begitu berguna dalam sebuah konstanta, tetapi ini mengilustrasikan pada Anda bahwa tiap fungsi memiliki nilai kembalian.
1 |
let value: () = printHelloWorld() |
Tupel
Fitur hebat lainnyaa dari Swift adalah kemapuannya mengembalikan banyak nilai dari suatu fungsi dengan mengembalikan tupel. Contoh berikut mengilustrasikan cara kerjanya. Izinkan saya mengulangi bahwa tidak penting bagi Anda untuk memahami bagaimana cara kerja fungsi timeComponentsForDate
. Fokusnya adalah mengembalikan nilai fungsi timeComponentsForDate
, suatu tupel dengan tiga elemen.
1 |
func timeComponentsForDate(date: NSDate) -> (hour: Int, minute: Int, second: Int) { |
2 |
let dateComponents = NSCalendar.currentCalendar().components((.CalendarUnitHour | .CalendarUnitMinute | .CalendarUnitSecond), fromDate: date) |
3 |
let hour = dateComponents.hour |
4 |
let minute = dateComponents.minute |
5 |
let second = dateComponents.second |
6 |
return (hour, minute, second) |
7 |
}
|
Fungsi ini menerima satu argumen, suatu contoh NSDate
, dan mengembalikan tupel dengan tiga nilai berlabel. Melabeli nilai-nilai tupel dilakukan hanya supaya lebih nyaman, boleh-boleh saja mengabaikan labelnya.
1 |
func timeComponentsForDate(date: NSDate) -> (Int, Int, Int) { |
2 |
let dateComponents = NSCalendar.currentCalendar().components((.CalendarUnitHour | .CalendarUnitMinute | .CalendarUnitSecond), fromDate: date) |
3 |
let hour = dateComponents.hour |
4 |
let minute = dateComponents.minute |
5 |
let second = dateComponents.second |
6 |
return (hour, minute, second) |
7 |
}
|
Meskipun demikian, sebagaimana contoh berikut mengilustrasikannya, melabeli nilai tupel yang dikembalikan oleh fungsi sangatlah baik dan membuat kode Anda lebih mudah dipahami.
1 |
let timeComponents = timeComponentsForDate(NSDate()) |
2 |
|
3 |
println(timeComponents.hour) |
4 |
println(timeComponents.minute) |
5 |
println(timeComponents.second) |
Mungkin juga mengembalikan nilai opsional dari fungsi jika ada tiga skenario yang fungsinya tidak memiliki nilai yang akan dikembalikan. Ini dilakukan semudah mendefinisikan tupe return fungsi sebagai sesuatu yang opsional, sebagaimana diperlihatkan berikut.
1 |
func timeComponentsForDate(date: NSDate) -> (hour: Int, minute: Int, second: Int)? { |
2 |
let dateComponents = NSCalendar.currentCalendar().components((.CalendarUnitHour | .CalendarUnitMinute | .CalendarUnitSecond), fromDate: date) |
3 |
let hour = dateComponents.hour |
4 |
let minute = dateComponents.minute |
5 |
let second = dateComponents.second |
6 |
return (hour, minute, second) |
7 |
}
|
Kesimpulan
Di tutorial ini kami memfokuskan pada dasar-dasar fungsi di Swift. Penting bagi Anda memahami sintaks fungsi, karena di artikel selanjutnya kita akan menjelajahi fungsi-fungsi yang lebih canggih yang dibuat berdasarkan pembahasan di tutorial ini.
Saya mendorong Anda untuk membaca artikelnya lagi jika diperlukan, dan lebih penting lagi, menulis fungsi-fungsi baru di taman bermain supaya akrab dengan sintaksnya. Dasarnya mudah dipahami, tetapi Anda hanya bisa memahaminya dengan mempraktekkannya.