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.

0 0 votes
Rating
Subscribe
Notify of
guest
0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments

0
Would love your thoughts, please comment.x
()
x