Saya menggunakan Xcode 6 Beta 4. Saya memiliki situasi aneh ini di mana saya tidak tahu bagaimana cara menguji untuk opsional.
Jika saya memiliki xyz opsional, adalah cara yang benar untuk menguji:
if (xyz) // Do something
atau
if (xyz != nil) // Do something
Dokumen mengatakan untuk melakukannya dengan cara pertama, tetapi saya telah menemukan bahwa kadang-kadang, cara kedua diperlukan, dan tidak menghasilkan kesalahan kompiler, tetapi di lain waktu, cara kedua menghasilkan kesalahan kompilator.
Contoh spesifik saya adalah menggunakan parser GData XML yang dijembatani ke swift:
let xml = GDataXMLDocument(
XMLString: responseBody,
options: 0,
error: &xmlError);
if (xmlError != nil)
Di sini, jika saya baru saja melakukannya:
if xmlError
itu akan selalu kembali benar. Namun, jika saya lakukan:
if (xmlError != nil)
lalu bekerja (seperti cara kerjanya di Objective-C).
Apakah ada sesuatu dengan XML GData dan cara memperlakukan opsional yang saya lewatkan?
Jawaban:
Di Xcode Beta 5, mereka tidak lagi membiarkan Anda melakukannya:
Ini menghasilkan kesalahan:
Anda harus menggunakan salah satu dari formulir ini:
sumber
Untuk menambah jawaban lain, alih-alih menugaskan variabel yang berbeda nama di dalam suatu
if
kondisi:Anda dapat menggunakan kembali nama variabel yang sama seperti ini:
Ini mungkin membantu Anda menghindari kehabisan nama variabel kreatif ...
Ini mengambil keuntungan dari variabel shadowing yang didukung di Swift.
sumber
Salah satu cara paling langsung untuk menggunakan opsional adalah sebagai berikut:
Dengan asumsi
xyz
adalah tipe opsional, sepertiInt?
misalnya.Dengan cara ini Anda bisa menguji apakah
xyz
mengandung nilai dan jika demikian, segera bekerja dengan nilai itu.Sehubungan dengan kesalahan kompiler Anda, tipe
UInt8
ini tidak opsional (perhatikan no '?') Dan karena itu tidak dapat dikonversi kenil
. Pastikan variabel yang Anda gunakan adalah opsional sebelum Anda memperlakukannya seperti variabel.sumber
Swift 3.0, 4.0
Terutama ada dua cara memeriksa opsional untuk nol. Berikut adalah contoh dengan perbandingan di antara mereka
1. jika dibiarkan
if let
adalah cara paling dasar untuk memeriksa opsi nihil. Kondisi lain dapat ditambahkan pada pemeriksaan nil ini, dipisahkan dengan koma. Variabel tidak boleh nol untuk pindah ke kondisi berikutnya. Jika hanya diperlukan pemeriksaan nil, hapus ketentuan tambahan dalam kode berikut.Selain itu, jika
x
tidak nol, penutupan jika akan dieksekusi danx_val
akan tersedia di dalam. Kalau tidak, penutupan lain dipicu.2. penjaga biarkan
guard let
dapat melakukan hal serupa. Tujuan utamanya adalah untuk membuatnya lebih masuk akal secara logis. Ini seperti mengatakan Pastikan variabel tidak nol, jika tidak hentikan fungsinya .guard let
juga dapat melakukan pengecekan kondisi tambahan sebagaiif let
.Perbedaannya adalah bahwa nilai yang terbuka akan tersedia pada cakupan yang sama seperti
guard let
, seperti yang ditunjukkan dalam komentar di bawah ini. Hal ini juga mengarah ke titik yang di penutupan lain, program ini memiliki untuk keluar dari lingkup saat ini, olehreturn
,break
, dllsumber
Dari panduan pemrograman cepat
Jadi cara terbaik untuk melakukan ini adalah
dan jika Anda menggunakan
xyz
pernyataan if. Kemudian Anda dapat membukaxyz
jika pernyataan dalam variabel konstan. Jadi Anda tidak perlu membuka setiap tempat di jika pernyataan di manaxyz
digunakan.Konvensi ini disarankan oleh
apple
dan akan diikuti oleh para penyembah.sumber
if xyz != nil {...}
.Walaupun Anda masih harus secara eksplisit membandingkan opsi dengan
nil
atau menggunakan penjilidan opsional untuk mengekstraksi nilainya secara tambahan (yaitu, opsional tidak secara implisit dikonversi menjadi nilai Boolean), perlu dicatat bahwa Swift 2 telah menambahkanguard
pernyataan untuk membantu menghindari piramida kiamat ketika bekerja dengan beberapa nilai opsional.Dengan kata lain, opsi Anda sekarang termasuk memeriksa secara eksplisit untuk
nil
:Ikatan opsional:
Dan
guard
pernyataan:Perhatikan bagaimana penjilidan opsional biasa dapat mengarah ke indentasi yang lebih besar ketika ada lebih dari satu nilai opsional:
Anda dapat menghindari bersarang ini dengan
guard
pernyataan:sumber
nil
nilai, tapi saya setuju bahwa kurva belajar sedikit curam. :)Perpanjangan Protokol 5 Swift
Berikut ini adalah pendekatan menggunakan ekstensi protokol sehingga Anda dapat dengan mudah menyejajarkan nil check opsional:
Pemakaian
sumber
swift
analog daripythonistas
yang mencoba untuk menjaga bahasa dalam bentuk kemurnian pythonic. Saya ambil? Saya baru saja mengangkat kode Anda ke mixin Utils saya.Sekarang Anda dapat melakukan dengan cepat hal-hal berikut yang memungkinkan Anda untuk mendapatkan kembali sedikit tujuan-c
if nil else
sumber
Alih-alih
if
, operator ternary mungkin berguna ketika Anda ingin mendapatkan nilai berdasarkan apakah ada sesuatu yang nihil:sumber
xyz == nil
Ekspresi tidak bekerja, tetapix != nil
bekerja. Tidak tahu kenapaPendekatan lain selain menggunakan
if
atauguard
pernyataan untuk melakukan penjilidan opsional adalah untuk memperluasOptional
dengan:ifValue
menerima penutupan dan menyebutnya dengan nilai sebagai argumen ketika opsional tidak nol. Digunakan seperti ini:Anda mungkin harus menggunakan
if
atauguard
karena itu adalah pendekatan yang paling konvensional (sehingga akrab) yang digunakan oleh programmer Swift.sumber
Salah satu opsi yang belum dicakup secara khusus adalah menggunakan sintaks nilai yang diabaikan Swift:
Saya suka ini karena memeriksa
nil
rasanya tidak pada tempatnya dalam bahasa modern seperti Swift. Saya pikir alasannya terasa tidak pada tempatnya adalah bahwanil
pada dasarnya nilai sentinel. Kami telah menghilangkan banyak penjaga di tempat lain dalam pemrograman modern sehingganil
terasa seperti itu juga harus dilakukan.sumber
Anda juga bisa menggunakannya
Nil-Coalescing Operator
Jika
optionalValue
adalahnil
, itu secara otomatis memberikan nilai kepadadefaultValue
sumber
Tes ini berfungsi seperti yang diharapkan dalam semua kasus. BTW, Anda tidak perlu tanda kurung
()
.sumber
if (xyz != nil)
.Jika Anda memiliki persyaratan dan ingin membuka dan membandingkan, bagaimana dengan memanfaatkan evaluasi hubung singkat ekspresi senyawa boolean seperti pada
Memang, ini tidak dapat dibaca seperti beberapa posting yang disarankan lainnya, tetapi menyelesaikan pekerjaan dan agak ringkas daripada solusi yang disarankan lainnya.
sumber