Saya telah melihat kode ini di situs Swift dan berbagai posting di sini dan saya mencoba memahami dasar-dasarnya. Bagaimana baris ini dievaluasi?
if let name = optionalName {
Saya bingung karena itu bukan nama == nama opsional, ini menetapkan nilainya, jadi bagaimana laporan itu benar dan mengapa tidak benar ketika Anda mengganti dengan john appleseed dengan nil, karena masih akan sama?
var optionalName: String? = "John Appleseed"
var greeting = "Hello!"
if let name = optionalName {
greeting = "Hello, \(name)"
}
if-statement
swift
DeadZero
sumber
sumber
if let
sintaks ini dikenal sebagai pengikatan opsional.Jawaban:
Pada dasarnya baris tersebut mengatakan, "jika Anda dapat membiarkan variabel baru
name
sama dengan versi non-opsionaloptionalName
, lakukan hal berikut dengannya". Seperti yang ditunjukkan Martin, ini disebut Penjilidan Opsional .Satu-satunya tujuan dari itu adalah untuk menguji apakah variabel opsional berisi nilai aktual dan mengikat bentuk non-opsional ke variabel sementara. Ini adalah cara yang aman untuk "membuka" sebuah opsional atau dengan kata lain, mengakses nilai yang terdapat dalam opsional. Ini sama sekali tidak menguji kesetaraan dalam bentuk apa pun. Ini hanya menguji keberadaan nilai dalam opsional.
sumber
if let
kami mengikat nilai ke variabel non-opsional (name
dalam contoh ini). Contoh Anda tidak akan dikompilasi karena sekarang tidak ada variabel yang dipanggilname
. Jika Anda mengubah contoh Anda untuk menggunakannyaoptionalName
akan dicetak sebagaiHello, Optional("John Appleseed")
. Anda dapat menggunakan paksa membuka bungkus setelah memeriksa nilHello, \(optionalName!)
tetapi ini hanya lebih rentan kesalahan jika Anda memindahkan bagian kode itu ke suatu tempat tanpa centang.Opsional adalah set atau not-set (bukan nil atau nil) ... meninggalkan kita dengan keputusan penting. "Bagaimana kita harus menulis kode kita sehingga dapat bekerja dengan benar untuk 2 negara bagian?". Cara kita membuka bungkus opsional adalah yang memutuskannya untuk kita.
Ada beberapa pendekatan yang dapat Anda gunakan untuk melawan not-set opsional.
Di bawah ini adalah 4 pendekatan
Menggunakan pembukaan paksa akan macet jika Anda tidak memiliki nilai. Anda ingin melakukan ini jika memiliki nilai itu sangat penting, misalnya judul film (setiap film HARUS memiliki nama).
!
digunakan untuk membuka bungkus paksa.Menggunakan penggabungan nil adalah cara lain yang akan memberi Anda lebih banyak kontrol , yang berarti tidak akan macet jika nilainya tidak disetel, juga tidak akan 'tidak disetel apa-apa' jika tidak disetel ... itu akan melakukan apa yang Anda perintahkan. untuk melakukan misalnya akan default / mengatur nama film ke untitled_movie jika tidak ada nama yang ditetapkan.
??
digunakan untuk penggabungan nol.var movieTitle = movie.title ?? "untitled_Movie"
Menggunakan Rangkaian opsional tidak akan melakukan apa pun jika Anda tidak memiliki nilai, dan akan menyetel nilai jika Anda memiliki nilai. Anda melakukan ini untuk sesuatu yang nilainya tidak begitu penting, misalnya untuk nama agen aktor Anda .
?
digunakan untuk rangkaian opsional.let agent = movie.leadActor?.agent //would not crash if you don't have a lead actor (optional chaining) let agent = movie.leadActor!.agent //would crash if you don't have a lead Actor (forced wrapping)
Menggunakan
if-let
(atauguard
yang merupakan dua jenis pengikatan opsional ) akan memberi Anda lebih banyak kontrol , tidak akan mogok jika nilainya tidak disetel. Jika nilainya ditetapkan, maka Anda dapat melakukan sesuatu. Jika tidak disetel, Anda dapat menambahkanelse
pernyataan.if let supportingActor = movie.supportingActor{ print(" The supporting actor is \(supportingActor)}
Ini adalah cara membuka bungkus yang paling umum digunakan, karena membuka bungkus secara paksa agak tidak disarankan. Untuk diskusi lebih lanjut tentang mengapa hal itu tidak disarankan, lihat di sini . Untuk perbandingan yang bagus antara
guard
danif-let
lihatguard vs. if-let
Catatan samping:
Penjilidan opsional dan rantai opsional biasanya digunakan bersama:
if let agent = movie.leadActor?.agent { ContactInfo = agent.phoneNumber } // if-let is the optional *binding* part, the movie dot leadActor dot is the optional *chaining*
sumber
Sintaks if menerima 2 kondisi berbeda. Yang kedua, pengikatan opsional, bukanlah boolean. Ini membingungkan, karena Anda dapat menulis:
if let name = optionalName {
tapi tidak
if (let name = optionalName) {
Dokumentasi Apple (referensi Swift):
sumber
if
hanya mengambil ekspresi boolean, selain itu akan menimbulkan kesalahan, jadi cuplikan kode ini mengatakanif let name = optionalName { }else{ }
jika optionalName nihil maka kondisinya salah dan pernyataan lain akan dieksekusi. Namun jika optionalName memiliki beberapa nilai maka nilai opsional tersebut tidak terbungkus / ditetapkan ke dalam variabel konstan yaitu nama.
sumber
Setiap kali Anda bekerja dengan referensi yang lemah, tipe opsional akan lebih baik digunakan jika membiarkan kode Anda dilindungi dengan aman dan menghindari crash Berikut adalah contohnya
var middleName :String? = "some thing" if let isExistsMiddleName = middleName { // do some thing here } else { // no middle name }
sumber