Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Swift
Code

Belajar Swift dari Zero: Parameter Fungsi, Tipe, dan Nesting

by
Difficulty:BeginnerLength:LongLanguages:
This post is part of a series called Swift From Scratch.
Swift From Scratch: An Introduction to Functions
Swift From Scratch: Closures

Malay (Melayu) translation by Rana Salsabiela (you can also view the original English article)

Di artikel sebelumnya , kami telah mengeksplorai fungsi-fungsi dasar di Swift. Tetapi fungsi-fungsi mempunyai lebih banyak lagi. Di dalam artikel ini, kami akan meneruskan penjelajahan tentang fungsi dan melihat ke dalam parameter-parameter, bersarang, dan fungsi jenis-jenis.

1. Parameter Nama-Nama Lokal & Eksternal

Nama Parameter

LokalMari lihat semula salah satu contoh di artikel sebelumnnya. Fungsi printMessage mendefinisikan satu parameter, message .

Walaupun kami memberikan nama pada parameter, message , kami tidak menggunakan nama itu ketika memanggil fungsinya. Kita memasukkan nilai untuk message parameter.

Nama yang kita definisikan untuk definisi fungsi adalah nama parameter lokal . Nilai parameter hanya boleh direferensikan dengan nama ini dalam badan fungsi. Parameter-parameter fungsi sedikit lebih fleksibel daripada itu. Mari saya jelaskan apa yang saya maksudkan dengan itu.

Objektif-C dikenali dengan metode yang panjang berkaitan nama. Walaupun kelihatan ribet dan tidak elegan bagi orang luar, hal ini membuat metodenya mudah dipahami dan jika dipilih dengan baik akan sangat menjelaskan. Jika anda fikir anda kehilangan manfaat apabila berpindah ke Swift, maka anda bersedia untuk terkejut.

Parameter Nama-Nama Eksternal

Sekiranya suatu fungsi menerima sejumlah parameter, tidak selalu jelas argumen mana yang berkaitan dengan parameter mana. Lihatlah contoh berikut untuk memahami permasalahannya lebih baik.

power fungsi memunculkan nilai a dengan exponen b . Kedua parameter tersebut bertipe Int . Walaupun kebanyakan orang akan secara intuitif memasukkan nilai dasar sebagai argumen pertama dan eksponennya sebagai argumen kedua, ini tidak jelas dari jenis, nama, dan tanda tangan fungsi. Sebagaimana yang kita lihat di artikel sebelumnya , cara memanggil fungsinya cukup langsung ke tujuan.

Untuk mengelakkan kebingungan, kami dapat memberikan parameter fungsi nama eksternal. Kita boleh menggunakan nama-nama eksternal ini apabila fungsinya dipanggil untuk secara jelas mengindikasikan argumen mana yang berhubungan dengan parameter mana. Lihat contoh yang telah diperbaharui di bawah ini.

Perhatian bahawa fungsi badan tidak berubah kerana nama lokal tidak berubah. Walau bagaimanapun, apabila kami memanggil fungsi yang telah diperbaharui, perbezaannya jelas dan hasilnya tidak lebih membingungkan.

Jika kedua jenis fungsi sama, (Int, Int) -> Int , fungsi-fungsinya berbeza. Dengan kata lain, fungsi kedua bukanlah deklarasi ulang fungsi pertama. Sintaks untuk memanggil fungsi kedua mungkin mengingatkan sebagian dari Anda akan Objective-C. Bukan hanya argumennya yang dijelaskan dengan terang, fungsi nama gabungan dan parameter menjelaskan tujuan fungsinya.

Dalam beberapa hal, anda mungkin ingin menggunakan nama yang sama untuk nama parameter tempatan dan eksternal. Ini dimungkinkan dan tidak ada perlunya mengetikkan parameter nama dua kali. Di contoh berikut, kami menggunakan base dan exponent sebagai nama parameter eksternal dan tempatan.

Dengan menuliskan prefiks parameter nama dengan simbol # , parameter nama berfungsi sebaagai nama lokal dan parameter external. Ini juga bermakna kita harus memperbarui fungsi fungsinya.

Penting untuk dicatat bahawa dengan menyediakan nama nama untuk parameter, bermakna anda diminta menggunakan nama itu ketika memanggil fungsi-fungsinya. Ini akan membawa kita ke default nilai-nilai.

Default Nilai Nilai

Kami membahas default parameter nilai dalam artikel sebelumnya , tetapi ada kelakuan default yang harus Anda sadari. Jika anda mendefinisikan nilai default parameter, Swift akan secara automatik menugaskkan suatu parameter parameter external ke parameter tersebut. Silakan melihat contohnya dari artikel sebelumnya .

Oleh kerana parameter kedua, format mempunyai nilai default, Swift akan secara automatik mengaturformat parameter format eksternal menjadi format . Dengan kata lain, hasilnya sama seakan kita menuliskan format prefiks dengan simbol # . Anda boleh mengujinya dengan memanggil fungsi di atas di taman bermain Anda. Apa yang berlaku jika anda memasukkan format tanpa menggunakan parameter parameter external parameter dari kedua parameter? Jawapannya ditunjukkan di bawah ini.

Swift sangat jelas mengenai apa yang perlu dilakukan. Ringkasnya, apabila anda mendefinisikan parameternya pilihan, Swift secara automatik mengatur parameter nama parameter ke local parameter nama. Ide di balik perilaku ini adalah untuk mengelakkan kebingungan dan ambiguitas.

Kendatipun perilaku ini adalah kebiasaan yang baik, dimungkinkan untuk mematikannya. Di definisi fungsi yang telah diperbaharui berikut, kita tambah garis bawah, biasanya yang ditambahkan adalah nama parameter eksternalnya. Ini akan memberitahu Swift bahawa kita tidak ingin menentukan nama parameter eksternal untuk parameter khusus itu, meskipun memiliki nilai default.

Sekarang kita dapat memanggil fungsi formatDate tanpa menyediakan nama untuk kedua argumen.

2. Parameter & Mutabilitas

Mari melawati contoh pertama di tutorial ini, fungsi printMessage . Apa yang berlaku apabila kita menukar parameter parameter dalam fungsi tubuh?

Tidak perlu waktu lama bagi Swift untuk mula mengeluh.

Secara lalai, parameter-parameter fungsi bersifat konstan. Dengan kata lain, walaupun kita dapat mengakses nilai parameter nilai fungsi, kita tidak dapat mengubah nilainya. Untuk menukar piawai ini, tambah kata kunci var ke parameter nama dalam fungsi definisi. Maka Swift akan membuat variasi salinan nilai parameter untuk Anda kerjakan dalam fungsi tubuh.

Perhatikan bahawa ini tidak bermakna anda boleh memasukkan nilai, memodifikasinya dalam fungsi, dan menggunakan nilai yang telah dimodifikasi setelah fungsi menyelesaikan pekerjaannya. Swift membuat salinan nilai parameter yang hanya ada selama masa pemanggilan fungsi. Ini juga diilustrasikan di blok kod berikut yang di situ kita memasukkan konstanta ke printMessage fungsi.

3. Parameter-Parameter Variadik

Istilahnya mungkin terdengar aneh di awal, parameter variadic adalah istilah yang umum dalam pemrograman. Suatu parameter variadik adalah parameter yang menerima nilai nol atau lebih. Nilainya harus berada dalam jenis yang sama . Menggunakan parameter variadic di Swift cukup sepele, boleh dilihat di ilustrasi pada contoh berikut.

Sintaksnya mudah difahami. Untuk tanda parameter sebagai variadik, anda menambahkan tiga titik ke parameter jenisnya. Dalam fungsi badan, variadik parameter boleh diakses sebagai array an. Pada contoh di atas, args adalah array dari nilai Int

. Karena Swift harus tahu argumen mana yang berhubungan dengan parameter mana, parameter variadic dibutuhkan sebagai parameter terakhir. Implikasinya adalah satu fungsi boleh mempunyai maksimal satu parameter variadik.

Hal di atas juga berlaku jika fungsi mempunyai parameter dengan default nilai. Parameter variadik harus selalu menjadi parameter terakhir.

4. Parameter Masuk

Di bahagian ini lebih awal tutorial ini, anda belajar bagaimana mendefinisikan mutabilitas parameter dengan menggunakan kata kunci var . Di bahagian itu, saya menekankan bahawa nilai parameter parameter hanya dapat diakses dari dalam fungsi tubuh. Jika anda ingin memasukkan nilai ke dalam fungsi, modifikasilah dalam fungsi, dan lewatkan kembali di luar fungsi, parameter yang Anda cari.

Contoh berikut menunjukkan permisalan bagaimana parameter keluar berfungsi di Swift dan bagaimana sintaksnya dilihat.

Kita telah mendefinisikan parameter pertama sebagai parameter keluar dengan menambahkan kata kunciinout . Parameter kedua adalah parameter biasa dengan nama extern withString dan nama lokal b . Mari kita lihat bagaimana cara memanggil fungsi ini.

Kita mendeklarasikan variable, world , dari jenis string dan memasukkannya ke fungsi perpendString . Parameter kedua adalah rentetan literal. Dengan memanggil fungsi ini, nilai world berubah menjadi Hello, world . Perhatikan bahawa pertama argumen diberi prefiks & untuk mengindikasikan ini parameter dalam keluar.

Jelas bahawa konstanta dan literal tidak boleh dimasukkan sebagai parameter keluar. Swift akan melempar kesalahan pada anda seperti yang digambarkan di dalam skrip berikut

Ini adalah bukti bahawa parameter keluar tidak dapat memiliki nilai default, baik itu variadik, atau didefinisikan sebagai var atau let . Sekiranya anda melupakan terperinci ini, Swift akan berbaik hati dengan memberikan anda pesan kesalahan.

5. Nesting

Di C dan Objektif-C, fungsi dan kaedah tidak boleh disarang. Walau demikian, di fungsi Swift yang bersarang lumayan biasa. Fungsi-fungsi yang telah kita lihat di sini dan artikel sebelumnya adalah contoh-contoh fungsi global, yang dijelaskan dalam ruang lingkup global.

Ketika kita mendefinisikan suatu fungsi di dalam fungsi global, itulah yang dimaksudkan sebagai fungsi bersarang. Fungsi bersarang mempunyai akses ke nilai yang dijelaskan dalam fungsi yang melingkupinya. Lihatlah contoh berikut untuk memahami hal ini dengan lebih baik.

Walaupun fungsi-fungsi dalam contoh ini tidak benar-benar sangat berguna, contohnya mengilustrasikan fungsi idea bersarang dan menangkap nilai. Fungsi printHelloWorld hanya boleh diakses dari dalam fungsi printMessage . Sebagaimana ditunjukkan dalam contoh tersebut, fungsi printHelloWorld mempunyai akses ke konstanta a . Nilainya ditangkap dengan fungsi nested dan oleh karenanya dapat diakses dalam fungsi tersebut. Swift menangani penangkapan nilai, termasuk mengelola nilai-nilai memori.

6. Tipe-Tipe

FungsiPada artikel sebelumnya , kita menyentuh jenis-jenis fungsi secara ringkas. Suatu fungsi punya jenis khusus, yang disusun atas jenis-yipe parameter fungsi dan tipe kembaliannya. Misalnya fungsi printMessage , adalah dari jenis (String) -> () . Ingatlah bahawa () menyimolkan Void , yang setara dengan tupel kosong.

Karena setiap fungsi memiliki tipe, adalah mungkin untuk mendefinisikan suatu fungsi yang menerima fungsi lain sebagai parameternya. Contoh berikut menunjukkan bagaimana kerjanya.

Fungsi printMessageWithFunction menerima rentetan sebagai parameter pertama dan fungsi jenis (String) -> () sebagai parameter keduanya. Di badan fungsi, fungsi yang kita masukkan dipanggil dengan messageargumen.

Contoh berikut juga mengilustrasikan bagaimana kita memanggil printMessageWithFunction fungsi. Konstanta myMesssage dimasukkan sebagai argumen pertama dan fungsi printMessage , yang kita definisikan sebelumnya, sebagai kedua argumen. Keren sekali bukan?

Sebagaimana yang saya sebutkan sebelumnya, mungkin untuk memulihkan fungsi daripada fungsi lain. Contoh seterusnya sedikit direka, tetapi menggambarkan seperti apa penampakan syntaxnya.

Pengiraan fungsi menerima suatu boolean dan mengembalikan jenis fungsi (Int, Int) -> Int. Fungsi compute mengandung dua fungsi bersarang yang juga merupakan jenis (Int, Int) -> Int , add dan subtract .

Pengiraan fungsi mengembalikan rujukan ke salah satu dari fungsi add atau subtract , berdasarkan addition nilai parameter. Contoh berikut juga menunjukkan cara menggunakan compute fungsi. Kita menyimpan rujukan ke fungsi yang dikembalikan oleh fungsi compute dalam computeFunction konstanta. Lalu kita memanggil fungsi yang disimpan dalam computeFunction , masukkan 1 dan 2 , menyimpan result dalam result , dan mencetak result nilai dalam keluaran standar. Contoh tadi mungkin kelihatan kompleks, tetapi sebenarnya mudah dimengerti jika Anda tahu apa yang terjadi.

Kesimpulan

Seharusnya anda sekarang sudah mempunyai pemahaman yang bagus tentang bagaimana cara kerja fungsi di Swift dan apa yang bisa anda lakukan terhadapnya. Fungsi-fungsi adalah tema yang umum di Swift dan anda akan menggunakannya secara luas ketika bekerja dengan Swift.

Pada artikel seterusnya kita akan menyelami dengan teliti konstruksi hebat yang sangat mirip dengan blok di C dan Objective-C, JavaScript fi penutupan, dan lambda di Ruby.

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.