Closure dalam Swift
Disini Kamu akan mempelajari apa yang membuat closure berbeda dari fungsi biasa dalam swift. Kita mulai dengan “Apa itu Closure?”
Closure adalah blok fungsi yang bisa Kamu masukkan di kode Kamu. Kamu bisa memasukkan closure sebagai argumen suatu fungsi atau Kamu bisa menyimpannya sebagai properti suatu objek.
Bisa dikatakan juga Closure adalah fungsi tanpa nama dan key func
(sampai saat ini).
Coding time… Silahkan buka Playground Kamu.
Fungsi
Sebelum masuk ke closure, kita mulai dengan fungsi dahulu. Silahkan buat fungsi penjumlahan.
func addition(number1: Int, number2: Int) -> Int { return number1 + number2 } var addFunction = addition addFunction(10, 30) // 40
Closure
Buat closure yang fungsinya sama/identik dengan contoh fungsi di atas. Blok Closure diawali dan diakhiri dengan {
dan }
.
var addClosures: (Int, Int) -> Int = { (number1: Int, number2: Int) in return number1 + number2 } addClosures(4, 10) // 14
Tipe dari addClosures
adalah (Int, Int) -> Int
dan itu identik dengan addition
dari contoh pertama. number1
dan number2
adalah parameter. Apa pun yang muncul setelah keyword in
adalah blok return.
Penulisan Singkat
Dalam penulisannya closure juga bisa tanpa return
seletelah in
jika closure hanya mengembalikan nilai.
var addClosuresTwo = { (number1: Int, number2: Int) -> Int in print("Hello") return number1 + number2 // return required } var addClosuresThree = { (number1: Int, number2: Int) in number1 + number2 // return not required } addClosuresThree(4, 6)
AddClosuresTwo
memerlukan return
karena ada tambahan baris kodeprint("Hello")
. Selain itu, Kamu dapat skip return
. Lalu kamu harus menambahkan tipe yang dikembalikan secara eksplisit ( -> Int
).
Kita ingin membuat lebih singkat, tentu saja bisa mari kita buat menjadi 1 baris.
var addClosuresFour: (Int, Int) -> Int = { $0 + $1 } addClosuresFour(4, 5) // 9
Pada contoh di atas, $0
dan $1
merujuk pada parameter pertama dan kedua. Swift bisa mengetahui 4 sebagai $0
dan 5, $1
dari addClosuresFour (4, 5)
.
Bisakah Kamu mengembalikan 1 atau lebih fungsi ke sebuah fungsi?
Mulai dari sini mungkin akan lebih membingungkan, tetap fokus. Kamu akan belajar cara membuat fungsi khusus. Jadi tidak hanya menggunakan closure sebagai parameter
dan tapi juga sebagai return
.
Return Closure
Terdapat 2 cara untuk membuat closure sebagai return
, tapi sebelum itu kita buat terlebih dahulu sebuah closure yang akan kita return
var addWithClosures: (Int, Int) -> Int = { (number1: Int, number2: Int) in return number1 + number2 }
Return Closure secara tidak langsung
Buat fungsi yang tipe return
nya adalah (Int, Int) -> Int.
func returnClosure() -> ((Int, Int) -> Int) { return addWithClosures } let addClosure = returnClosure() addClosure(4, 10) let addClosureTwo = returnClosure()(4, 10) // addWithClosure(4, 10) print(addClosureTwo) // 14
Kamu telah mengembalikan addWithClosures
yang tipenya adalah (Int, Int) -> Int
.
Return Closure secara langsung
Kamu dapat mengembalikan closure secara langsung, sebagai ganti dari addWithClosures
.
func returnClosureDirectly() -> ((Int, Int) -> Int) { return { (number1, number2) in number1 + number2 } } returnClosureDirectly()(4, 10) // 14
Atau jika Kamu ingin lebih singkat
func returnClosureDirectlyTwo() -> ((Int, Int) -> Int) { return { $0 + $1 } } returnClosureDirectlyTwo()(4, 10) // 14
Passing Closure
Buat fungsi yang parameternya menerima () -> String
. Kemudian, jalankan blok closure dalam fungsi.
func insertClosureBlock(closureBlock: () -> String) -> String { return closureBlock() }
Buat closure yang akan diteruskan dalam fungsi insertClosureBlock
.
func hello() -> String { return "hello" }
Passing Closure secara tidak langsung
insertClosureBlock(closureBlock: hello) // "hello"
Passing Closure secara langsung
insertClosureBlock { () in return "hello" } insertClosureBlock { () in "hello" } insertClosureBlock(closureBlock: { return "hello" }) insertClosureBlock(closureBlock: { "hello" })
Ingat bahwa tiap fungsi adalah closure. Dengan kata lain, aturan yang sama berlaku untuk closure yang tanpa nama.
Ada tiga jenis closure:
- fungsi global
- fungsi nested
- ekspresi closure
Closure merupakan konsep penting dan Kamu akan sering gunakan di Swift. Closure memungkinkan Kamu menulis kode yang fleksibel dan dinamis yang proses penulisannya mudah sekaligus mudah dipahami.
Semoga bermanfaat.