Skip to content Skip to sidebar Skip to footer

Belajar Swift : Cara Menggunakan Closure di Swift

Cara Menggunakan Closure di Swift



Closures di Swift 4 mirip dengan fungsi mandiri yang diatur sebagai blok dan dipanggil di mana saja seperti bahasa C dan Objective C. Konstanta dan referensi variabel yang ditentukan di dalam fungsi ditangkap dan disimpan dalam closure. Fungsi dianggap sebagai kasus penutupan khusus dan mengambil tiga bentuk berikut -

Fungsi GlobalFungsi BersarangEkspresi Penutupan
Punya nama. Jangan menangkap nilai apa punPunya nama. Tangkap nilai dari fungsi penutupPenutupan Tanpa Nama menangkap nilai dari blok yang berdekatan

Ekspresi penutupan dalam bahasa Swift 4 mengikuti gaya sintaks yang tajam, optimalisasi, dan ringan yang mencakup.

  • Parameter inferensi dan tipe nilai kembalian dari konteks.
  • Pengembalian implisit dari penutupan ekspresi tunggal.
  • Nama argumen singkatan dan
  • Sintaks penutupan trailing

Sintaksis

Berikut ini adalah sintaks umum untuk mendefinisikan closure yang menerima parameter dan mengembalikan tipe data -

{
   (parameters) −> return type in
   statements
}

Berikut adalah contoh sederhana -

let studname = { print("Welcome to Swift Closures") }
studname()

Ketika kami menjalankan program di atas menggunakan playground, kami mendapatkan hasil sebagai berikut -

Welcome to Swift Closures

Penutupan berikut menerima dua parameter dan mengembalikan nilai Bool -

{     
   (Int, Int) −> Bool in
   Statement1
   Statement 2
   ---
   Statement n
}

Berikut adalah contoh sederhana -

let divide = {
   (val1: Int, val2: Int) -> Int in 
   return val1 / val2 
}

let result = divide(200, 20)
print (result)

Ketika kami menjalankan program di atas menggunakan playground, kami mendapatkan hasil sebagai berikut -

10

Ekspresi dalam Penutupan

Fungsi bersarang menyediakan cara yang nyaman untuk menamai dan menentukan blok kode. Alih-alih mewakili seluruh deklarasi fungsi dan konstruksi nama digunakan untuk menunjukkan fungsi yang lebih pendek. Mewakili fungsi dalam pernyataan singkat yang jelas dengan sintaks terfokus dicapai melalui ekspresi closure.

Program Ascending Order

Pengurutan string dicapai dengan fungsi cadangan tombol Swift 4s "diurutkan" yang sudah tersedia di pustaka standar. Fungsi ini akan mengurutkan string yang diberikan dalam urutan menaik dan mengembalikan elemen dalam larik baru dengan ukuran dan tipe data yang sama yang disebutkan di larik lama. Array lama tetap sama.

Dua argumen direpresentasikan di dalam fungsi yang diurutkan -

  • Nilai dari tipe yang Dikenal direpresentasikan sebagai array.

  • Isi larik (Int, Int) dan mengembalikan nilai Boolean (Bool) jika larik diurutkan dengan benar itu akan mengembalikan nilai benar jika tidak maka akan mengembalikan salah.

Fungsi normal dengan string input ditulis dan diteruskan ke fungsi yang diurutkan untuk mendapatkan string yang diurutkan ke array baru yang ditunjukkan di bawah ini -

func ascend(s1: String, s2: String) -> Bool {
   return s1 > s2
}

let stringcmp = ascend(s1: "Swift 4", s2: "great")
print (stringcmp)

Ketika kami menjalankan program di atas menggunakan playground, kami mendapatkan hasil sebagai berikut -

true

Array awal yang akan diurutkan untuk icecream diberikan sebagai "Swift 4" dan "hebat". Fungsi untuk mengurutkan array dideklarasikan sebagai tipe data string dan tipe kembaliannya disebut Boolean. Kedua string tersebut dibandingkan dan diurutkan dalam urutan menaik dan disimpan dalam array baru. Jika pengurutan berhasil dilakukan, fungsi akan mengembalikan nilai benar jika tidak maka akan mengembalikan salah.

Penggunaan sintaks ekspresi penutupan -

  • parameter konstan,
  • parameter variabel, dan
  • parameter masuk.

Ekspresi penutupan tidak mendukung nilai default. Parameter variadic dan Tuple juga dapat digunakan sebagai tipe parameter dan tipe kembalian.

let sum = {
   (no1: Int, no2: Int) -> Int in 
   return no1 + no2 
}

let digits = sum(10, 20)
print(digits)

Ketika kami menjalankan program di atas menggunakan playground, kami mendapatkan hasil sebagai berikut -

30

Parameter dan deklarasi tipe kembalian yang disebutkan dalam pernyataan fungsi juga dapat diwakili oleh fungsi ekspresi penutupan sebaris dengan kata kunci 'in'. Setelah mendeklarasikan parameter dan jenis kembalian 'dalam' kata kunci digunakan untuk menunjukkan bahwa tubuh penutupan.

Pengembalian Implisit Ekspresi Tunggal

Di sini, tipe fungsi dari argumen kedua fungsi yang diurutkan memperjelas bahwa nilai Bool harus dikembalikan oleh closure. Karena badan closure berisi ekspresi tunggal (s1> s2) yang mengembalikan nilai Bool, tidak ada ambiguitas, dan kata kunci return bisa dihilangkan.

Untuk mengembalikan pernyataan ekspresi tunggal dalam penutupan ekspresi 'kembali' kata kunci dihilangkan di bagian deklarasinya.

var count:[Int] = [5, 10, -6, 75, 20]
let descending = count.sorted(by: { n1, n2 in n1 > n2 })
let ascending = count.sorted(by: { n1, n2 in n1 < n2 })

print(descending)
print(ascending)

Ketika kami menjalankan program di atas menggunakan playground, kami mendapatkan hasil sebagai berikut -

[75, 20, 10, 5, -6]
[-6, 5, 10, 20, 75]

Pernyataan itu sendiri dengan jelas mendefinisikan bahwa ketika string1 lebih besar dari string 2 mengembalikan true jika tidak salah maka pernyataan return dihilangkan di sini.

Jenis Penutupan yang Diketahui

Pertimbangkan penambahan dua angka. Kita tahu bahwa penambahan akan mengembalikan tipe data integer. Oleh karena itu tipe closure yang dikenal dideklarasikan sebagai -

let sub = {
   (no1: Int, no2: Int) -> Int in 
   return no1 - no2 
}

let digits = sub(10, 20)
print(digits)

Ketika kami menjalankan program di atas menggunakan playground, kami mendapatkan hasil sebagai berikut -

-10

Mendeklarasikan Nama Argumen Singkatan sebagai Penutup

Swift 4 secara otomatis memberikan nama argumen singkatan ke penutupan sebaris, yang dapat digunakan untuk merujuk ke nilai argumen penutupan dengan nama $ 0, $ 1, $ 2, dan seterusnya.

var shorthand: (String, String) -> String
shorthand = { $1 }
print(shorthand("100", "200"))

Di sini, $ 0 dan $ 1 merujuk ke argumen String penutup pertama dan kedua.

Ketika kami menjalankan program di atas menggunakan playground, kami mendapatkan hasil sebagai berikut -

200

Swift 4 memfasilitasi pengguna untuk merepresentasikan penutupan Inline sebagai nama argumen singkatan dengan mewakili $ 0, $ 1, $ 2 --- $ n.

Daftar argumen closure dihilangkan di bagian definisi saat kita merepresentasikan nama argumen steno di dalam ekspresi closure. Berdasarkan tipe fungsi, nama argumen singkatan akan diturunkan. Karena argumen singkatan didefinisikan dalam badan ekspresi, kata kunci 'in' dihilangkan.

Penutupan sebagai Fungsi Operator

Swift 4 menyediakan cara mudah untuk mengakses anggota hanya dengan menyediakan fungsi operator sebagai penutup. Dalam contoh sebelumnya kata kunci 'Bool' digunakan untuk mengembalikan 'true' ketika string sama, jika tidak ia mengembalikan 'false'.

Ekspresi dibuat lebih sederhana dengan fungsi operator dalam closure sebagai -

let numb = [98, -20, -30, 42, 18, 35]
var sortedNumbers = numb.sorted ({
   (left: Int, right: Int) -> Bool in
   return left < right
})

let asc = numb.sorted(<)
print(asc)

Ketika kami menjalankan program di atas menggunakan playground, kami mendapatkan hasil sebagai berikut -

[-30, -20, 18, 35, 42, 98]

Penutupan sebagai Trailer

Meneruskan argumen terakhir fungsi ke ekspresi closure dideklarasikan dengan bantuan 'Trailing Closures'. Itu ditulis di luar fungsi () dengan {}. Penggunaannya diperlukan ketika tidak memungkinkan untuk menulis fungsi sebaris pada satu baris.

reversed = sorted(names) { $0 > $1}

di mana {$ 0> $ 1} direpresentasikan sebagai penutupan akhir yang dideklarasikan di luar (nama).

import Foundation
var letters = ["North", "East", "West", "South"]

let twoletters = letters.map({ 
   (state: String) -> String in
   return state.substringToIndex(advance(state.startIndex, 2)).uppercaseString
})

let stletters = letters.map() { 
   $0.substringToIndex(advance($0.startIndex, 2)).uppercaseString 
}
print(stletters)

Ketika kami menjalankan program di atas menggunakan playground, kami mendapatkan hasil sebagai berikut -

[NO, EA, WE, SO]

Menangkap Nilai dan Jenis Referensi

Di Swift 4, menangkap nilai konstanta dan variabel dilakukan dengan bantuan closure. Ini selanjutnya merujuk dan memodifikasi nilai untuk konstanta dan variabel tersebut di dalam badan closure meskipun variabel tersebut sudah tidak ada lagi.

Menangkap nilai konstanta dan variabel dilakukan dengan menggunakan fungsi bersarang dengan menulis fungsi dengan di badan fungsi lain.

Fungsi bersarang menangkap -

  • Argumen fungsi luar.
  • Menangkap konstanta dan variabel yang ditentukan dalam fungsi Luar.

Di Swift 4, ketika sebuah konstanta atau variabel dideklarasikan di dalam sebuah fungsi, referensi ke variabel tersebut juga secara otomatis dibuat oleh closure. Ini juga menyediakan fasilitas untuk merujuk lebih dari dua variabel sebagai closure yang sama sebagai berikut -

let decrem = calcDecrement(forDecrement: 18)
decrem()

Di sini variabel oneDecrement dan Decrement akan menunjukkan blok memori yang sama sebagai referensi penutupan.

func calcDecrement(forDecrement total: Int) -> () -> Int {
   var overallDecrement = 100
   func decrementer() -> Int {
      overallDecrement -= total
      print(overallDecrement)
      return overallDecrement
   }
   return decrementer
}

let decrem = calcDecrement(forDecrement: 18)
decrem()
decrem()
decrem()

Ketika kami menjalankan program di atas menggunakan playground, kami mendapatkan hasil sebagai berikut -

82
64
46

Ketika setiap kali fungsi luar calcDecrement dipanggil, ia memanggil fungsi decrementer () dan mengurangi nilainya sebesar 18 dan mengembalikan hasilnya dengan bantuan fungsi luar calcDecrement. Di sini calcDecrement bertindak sebagai penutupan.

Meskipun fungsi decrementer () tidak memiliki argumen, penutupan secara default merujuk ke variabel 'overallDecrement' dan 'total' dengan menangkap nilai yang ada. Salinan nilai untuk variabel tertentu disimpan dengan fungsi decrementer () baru. Swift 4 menangani fungsi manajemen memori dengan mengalokasikan dan membatalkan alokasi ruang memori saat variabel tidak digunakan.

Post a Comment for "Belajar Swift : Cara Menggunakan Closure di Swift"

close