Wawancara - 10 pertanyaan tentang Swift. Bagian 2

Semakin sedikit waktu yang tersisa hingga peluncuran kursus "Pengembang iOS" , jadi hari ini kami terus menerbitkan materi dari seri "10 Pertanyaan tentang Swift". Bagian pertama yang bisa dibaca di sini .



Jelaskan obat generik di Swift?


Generik (template generik) memungkinkan Anda untuk menulis fungsi dan tipe yang fleksibel dan dapat digunakan kembali yang dapat bekerja dengan semua jenis. Anda dapat menulis kode yang menghindari duplikasi dan mengekspresikan tujuannya secara jelas dan abstrak.

Jenis Array dan Kamus di Swift adalah koleksi universal (generik).
Dalam kode di bawah ini, fungsi universal untuk menukar dua nilai digunakan untuk string dan integer. Ini adalah contoh kode yang dapat digunakan kembali.

func swapTwoValues<T>(_ a: inout T, _ b: inout T) { let temporaryA = a a = b b = temporaryA } var num1 = 4 var num2 = 5 var str1 = β€œa” var str2 = β€œb” swapTwoValues(&num1,&num2) swapTwoValues(&str1,&str2) print (β€œnum1:”, num1) //output: 5 print (β€œnum2:”, num2) //output: 4 print (β€œstr1:”, str1) //output: b print (β€œstr2:”, str2) //output: a 

Apa jenis opsional dalam cepat dan kapan harus digunakan?


Opsional (Opsional, β€œopsional”) di Swift adalah jenis yang nilainya mungkin atau mungkin tidak. Opsi ditunjukkan dengan menambahkan "?" untuk jenis apa pun.

Opsi untuk menggunakan opsional:

  1. Cuplikan kode yang mungkin gagal (saya mengharapkan sesuatu, tetapi tidak menerima apa pun).
  2. Objek yang saat ini kosong tetapi dapat menjadi sesuatu nanti (dan sebaliknya).

Contoh opsional yang bagus:

Properti yang mungkin atau mungkin tidak ada , seperti nama tengah atau suami / istri di kelas Person.

Metode yang dapat mengembalikan nilai atau tidak sama sekali , misalnya, cocok dengan array.

Metode yang dapat mengembalikan hasil atau mendapatkan kesalahan dan tidak mengembalikan apa pun , misalnya, cobalah membaca konten file (sebagai hasilnya data file biasanya akan dikembalikan), tetapi file tersebut tidak ada.

Mendelegasikan properti yang tidak selalu harus ditetapkan dan biasanya ditetapkan setelah inisialisasi.

Suka tautan lemah di kelas . Apa yang mereka tunjuk dapat disetel ke nol kapan saja.

Jika Anda memerlukan cara untuk mengetahui kapan nilainya diatur (data belum dimuat> data) alih-alih menggunakan variabel boolean terpisah, dataLoaded.

Apa itu chaining opsional di Swift?


Proses permintaan, memanggil properti, subskrip dan metode untuk opsional, yang mungkin memiliki nilai "nihil", didefinisikan sebagai urutan opsional (rantai opsional) .

Urutan opsional mengembalikan dua nilai -
  • jika opsi berisi "nilai", maka ketika properti, metode, dan subskrip yang terkait dengannya dipanggil, nilai dikembalikan
  • jika opsional berisi "nihil", semua properti, metode dan subskrip yang terkait dengannya mengembalikan nihil

Urutan opsional adalah alternatif untuk membongkar paksa.

Apa yang dipaksa dibuka?


Membongkar paksa adalah cara untuk mengambil nilai yang terkandung dalam opsional. Operasi ini berbahaya karena Anda pada dasarnya memberi tahu kompiler: Saya yakin bahwa opsi ini mengandung nilai nyata, ekstrak!

 let value: Int? = 1 let newValue: Int = value! //  newValue  1 let anotherOptionalInt: Int? = nil let anotherInt = anotherOptionalInt! // Output:fatal error:  nil    . 

Apa itu bungkusan implisit?


Pembongkaran tersirat : ketika kita mendefinisikan opsi secara implisit dibongkar, kita mendefinisikan sebuah wadah yang secara otomatis akan membongkar setiap kali kita membacanya.

 var name: String! = β€œVirat” let student = name //       name = nil let player = name //Output:fatal error:  nil    . 

Jika opsional yang dibongkar secara implisit adalah nihil dan Anda mencoba mengakses nilainya yang dikemas, Anda akan melempar kesalahan runtime. Hasilnya persis sama seperti jika Anda menempatkan tanda seru setelah opsional biasa, yang tidak mengandung nilai.

Apa yang mengikat opsional?


Anda dapat membongkar opsi dengan cara "aman" atau "tidak aman". Cara yang aman adalah dengan menggunakan binder opsional.

Ikatan opsional digunakan untuk menentukan apakah opsional mengandung nilai, dan jika demikian, kami akan membuat nilai itu tersedia sebagai konstanta waktu atau variabel. Jadi, tidak perlu menggunakan sufiks! untuk mengakses nilainya.

 let possibleString: String? = "Hello" if let actualString = possibleString { //actualString -  ( )   // ,   possibleString print(actualString) } else { //possibleString   ,   // } 

Apa itu Guard dan apa manfaatnya?


Pernyataan guard itu sederhana dan kuat. Itu memeriksa beberapa kondisi dan, jika itu dievaluasi sebagai salah, pernyataan lain dijalankan, yang biasanya mengakhiri metode.

 func addStudent(student: [String: String]) { guard let name = student["name"] else { return } print("Added \(name)!") guard let rollNo = student ["rollNo"] else { print("roll No not assigned") return } print("Assigned roll no is \(rollNo).") } addStudent(student: ["name": "Ravi"]) //  "Added Ravi!" //  "roll No not assigned" addStudent(student: ["name": "Ravi", "rollNo": "1"]) //  "Added Ravi!" //  "Assigned roll no is 1" 

Keuntungan dari guard adalah eksekusi lebih cepat . Blok Guard dieksekusi hanya jika kondisinya salah dan blok akan keluar melalui pernyataan transfer kontrol seperti return , break , continue atau thrown . Ini memberikan jalan keluar awal dan kurung lebih sedikit. Keluar awal berarti eksekusi lebih cepat.

Silakan merujuk ke artikel ini untuk informasi lebih lanjut.

Kapan guard let harus digunakan, dan kapan if let ?

  • Gunakan guard saat Anda ingin menghilangkan input yang tidak terduga / salah dan fokus pada tujuan jika Anda memiliki cara alternatif dalam menangani input.
  • Gunakan guard if else menghalangi untuk mengurangi sarang dan lekukan, karena itu relatif kompak.

Apa itu defer ?


defer digunakan untuk mengeksekusi serangkaian pernyataan sesaat sebelum eksekusi kode meninggalkan blok saat ini.

defer di dalam blok if akan dieksekusi terlebih dahulu. Ini diikuti oleh pola LIFO untuk mengeksekusi pernyataan defer tersisa.

 func doSomething() { defer { print(β€œ1”)} defer { print(β€œ2”)} defer { print(β€œ3”)} if 1<2 { defer { print("1<2")} } defer { print(β€œ4”)} defer { print(β€œ5”)} defer { print(β€œ6”)} }  1<2 6 5 4 3 2 1 

Daftar operator transfer kontrol mana yang digunakan di Swift?


break - Pernyataan break mengakhiri eksekusi seluruh aliran pernyataan kontrol segera.

continue - pernyataan continue memberitahu loop untuk menghentikan apa yang dilakukannya dan mulai lagi di awal iterasi loop berikutnya.
return - mengembalikan nilai dari fungsi.
throw - perlu penerusan kesalahan menggunakan Throwing Functions
fallthrough - pernyataan fallthrough digunakan dalam switch case block untuk mengeksekusi statement case, yang berada di sebelah pernyataan case yang sesuai berdasarkan kebutuhan pengguna.

Dalam swift operator fallthrough digunakan untuk mengeksekusi kasus berikutnya, bahkan jika itu tidak cocok dengan aslinya.

 let integerToDescribe = 5 var description = β€œThe number \(integerToDescribe) is” switch integerToDescribe { case 2, 3, 5, 7, 11, 13, 17, 19: description += β€œ a prime number, and also” fallthrough case 10: description += β€œ case 10.” default: description += β€œ an integer.” } print(description)// :The number 5 is a prime number, and also case 10. 

Akhir dari bagian kedua. Bagian pertama bisa dibaca di sini .

Kami menunggu komentar Anda dan mengingat bahwa dalam beberapa jam akan ada hari terbuka , dalam kerangka yang akan kami bicarakan secara terperinci tentang kursus kami.

Source: https://habr.com/ru/post/id452806/


All Articles