Dari dokumentasi Apple :
Anda bisa menggunakan
if
danlet
bersama - sama bekerja dengan nilai-nilai yang mungkin hilang. Nilai-nilai ini direpresentasikan sebagai opsional. Nilai opsional mengandung nilai atau berisinil
untuk menunjukkan bahwa nilai tersebut hilang. Tulis tanda tanya (?
) setelah jenis nilai untuk menandai nilai sebagai opsional.
Mengapa Anda ingin menggunakan nilai opsional?
Jawaban:
Opsional dalam Swift adalah jenis yang dapat menyimpan nilai atau tidak ada nilai. Opsional ditulis dengan menambahkan a
?
ke jenis apa pun:Opsional (bersama dengan Generik) adalah salah satu konsep Swift yang paling sulit untuk dipahami. Karena cara mereka ditulis dan digunakan, mudah untuk mendapatkan ide yang salah tentang apa mereka. Bandingkan opsi di atas untuk membuat String normal:
Dari sintaks sepertinya String opsional sangat mirip dengan String biasa. Ini bukan. String opsional bukan String dengan beberapa pengaturan "opsional" dihidupkan. Ini bukan jenis spesial String. String dan String opsional adalah tipe yang sama sekali berbeda.
Inilah hal yang paling penting untuk diketahui: Pilihan adalah sejenis wadah. String opsional adalah wadah yang mungkin berisi String. Int opsional adalah wadah yang mungkin mengandung Int. Pikirkan opsional sebagai semacam paket. Sebelum Anda membukanya (atau "membuka" dalam bahasa opsional) Anda tidak akan tahu apakah itu mengandung sesuatu atau tidak sama sekali.
Anda dapat melihat bagaimana opsional diterapkan di Perpustakaan Standar Swift dengan mengetikkan "Opsional" ke dalam file Swift apa pun dan mengkliknya. Inilah bagian penting dari definisi:
Opsional hanya merupakan
enum
salah satu dari dua kasus:.none
atau.some
. Jika itu.some
, ada nilai terkait yang, dalam contoh di atas, akan menjadiString
"Halo". Pilihan menggunakan Generics untuk memberikan tipe ke nilai terkait. Jenis String opsional tidakString
, ituOptional
, atau lebih tepatnyaOptional<String>
.Segala sesuatu yang dilakukan Swift dengan opsional adalah keajaiban untuk membuat membaca dan menulis kode lebih lancar. Sayangnya ini mengaburkan cara kerjanya. Saya akan membahas beberapa trik nanti.
Catatan: Saya akan banyak berbicara tentang variabel opsional, tetapi tidak masalah untuk membuat konstanta opsional juga. Saya menandai semua variabel dengan tipe mereka untuk membuatnya lebih mudah untuk memahami tipe tipe yang sedang dibuat, tetapi Anda tidak harus dalam kode Anda sendiri.
Cara membuat opsional
Untuk membuat opsional, tambahkan
?
setelah jenis yang ingin Anda bungkus. Jenis apa pun bisa opsional, bahkan jenis kustom Anda sendiri. Anda tidak dapat memiliki ruang antara jenis dan?
.Menggunakan opsional
Anda dapat membandingkan opsi
nil
untuk melihat apakah ada nilai:Ini agak membingungkan. Ini menyiratkan bahwa opsional adalah satu atau lain hal. Entah nol atau "Bob". Ini tidak benar, opsional tidak berubah menjadi sesuatu yang lain. Membandingkannya dengan nol adalah trik untuk membuat kode yang lebih mudah dibaca. Jika opsional sama dengan nihil, ini berarti enum saat ini disetel ke
.none
.Hanya opsional yang boleh nol
Jika Anda mencoba mengatur variabel non-opsional menjadi nil, Anda akan mendapatkan kesalahan.
Cara lain untuk melihat opsional adalah sebagai pelengkap variabel Swift normal. Mereka adalah counterpart ke variabel yang dijamin memiliki nilai. Swift adalah bahasa yang hati-hati yang membenci ambiguitas. Sebagian besar variabel didefinisikan sebagai non-opsional, tetapi kadang-kadang ini tidak mungkin. Misalnya, bayangkan pengontrol tampilan yang memuat gambar baik dari cache atau dari jaringan. Mungkin atau mungkin tidak memiliki gambar itu pada saat pengontrol tampilan dibuat. Tidak ada cara untuk menjamin nilai untuk variabel gambar. Dalam hal ini Anda harus membuatnya opsional. Dimulai saat
nil
dan ketika gambar diambil, opsional mendapatkan nilai.Menggunakan opsional mengungkapkan niat pemrogram. Dibandingkan dengan Objective-C, di mana objek apa pun bisa nihil, Swift perlu Anda jelaskan kapan nilai bisa hilang dan kapan dijamin ada.
Untuk menggunakan opsional, Anda "membuka"
Opsional
String
tidak dapat digunakan sebagai pengganti yang sebenarnyaString
. Untuk menggunakan nilai terbungkus di dalam opsional, Anda harus membukanya. Cara termudah untuk membuka bungkusan opsional adalah dengan menambahkan!
setelah nama opsional. Ini disebut "force unrapping". Ini mengembalikan nilai di dalam opsional (sebagai tipe asli) tetapi jika opsionalnil
, itu menyebabkan crash runtime. Sebelum membuka bungkus, Anda harus yakin ada nilainya.Memeriksa dan menggunakan opsional
Karena Anda harus selalu memeriksa nol sebelum membuka dan menggunakan opsional, ini adalah pola umum:
Dalam pola ini Anda memeriksa bahwa ada nilai, maka ketika Anda yakin itu, Anda memaksa membuka itu menjadi konstanta sementara untuk digunakan. Karena ini adalah hal yang biasa dilakukan, Swift menawarkan jalan pintas menggunakan "jika dibiarkan". Ini disebut "penjilidan opsional".
Ini menciptakan konstanta sementara (atau variabel jika Anda ganti
let
denganvar
) yang cakupannya hanya di dalam kurung if. Karena harus menggunakan nama seperti "unwrappedMealPreference" atau "realMealPreference" adalah beban, Swift memungkinkan Anda untuk menggunakan kembali nama variabel asli, membuat nama temporer dalam lingkup braketBerikut beberapa kode untuk menunjukkan bahwa variabel yang berbeda digunakan:
Ikatan opsional berfungsi dengan memeriksa untuk melihat apakah opsional sama dengan nol. Jika tidak, ia membuka opsi ke konstanta yang disediakan dan mengeksekusi blok. Dalam Xcode 8.3 dan yang lebih baru (Swift 3.1), mencoba untuk mencetak opsional seperti ini akan menyebabkan peringatan yang tidak berguna. Gunakan opsional
debugDescription
untuk membungkamnya:Apa itu opsional?
Opsional memiliki dua kasus penggunaan:
Beberapa contoh nyata:
middleName
atauspouse
diPerson
kelasweak
properti di kelas. Hal yang mereka tunjuk dapat diaturnil
kapan sajaBoolean
Opsional tidak ada di Objective-C tetapi ada konsep yang setara, mengembalikan nol. Metode yang dapat mengembalikan objek dapat mengembalikan nol. Ini berarti "tidak adanya objek yang valid" dan sering digunakan untuk mengatakan bahwa ada sesuatu yang salah. Ini hanya bekerja dengan objek Objective-C, bukan dengan primitif atau tipe-C dasar (enum, struct). Objective-C sering memiliki tipe khusus untuk mewakili tidak adanya nilai-nilai ini (
NSNotFound
yang sebenarnyaNSIntegerMax
,kCLLocationCoordinate2DInvalid
untuk mewakili koordinat yang tidak valid,-1
atau beberapa nilai negatif juga digunakan). Coder harus mengetahui nilai-nilai khusus ini sehingga harus didokumentasikan dan dipelajari untuk setiap kasus. Jika suatu metode tidak dapat mengambilnil
sebagai parameter, ini harus didokumentasikan. Di Objective-C,nil
adalah pointer sama seperti semua objek didefinisikan sebagai pointer, tetapinil
menunjuk ke alamat (nol) tertentu. Dalam bahasa Swift,nil
adalah literal yang berarti tidak adanya tipe tertentu.Dibandingkan dengan
nil
Anda dulu dapat menggunakan opsi apa pun sebagai
Boolean
:Dalam versi terbaru Swift yang harus Anda gunakan
leatherTrim != nil
. Kenapa ini? Masalahnya adalah bahwaBoolean
dapat dibungkus dengan opsional. Jika sudahBoolean
seperti ini:ia memiliki dua jenis "salah", satu di mana tidak ada nilai dan satu di mana ia memiliki nilai tetapi nilainya
false
. Swift membenci ambiguitas jadi sekarang Anda harus selalu memeriksa opsi menentangnil
.Anda mungkin bertanya-tanya apa gunanya opsional
Boolean
? Seperti dengan opsional lainnya.none
negara dapat menunjukkan bahwa nilainya belum diketahui. Mungkin ada sesuatu di ujung lain dari panggilan jaringan yang membutuhkan waktu untuk polling. Boolean Opsional juga disebut " Boolean Tiga Nilai "Trik cepat
Swift menggunakan beberapa trik untuk memungkinkan opsional berfungsi. Pertimbangkan tiga baris kode opsional yang tampak biasa ini;
Tak satu pun dari baris ini harus dikompilasi.
String
tipe yang berbedaSaya akan membahas beberapa detail implementasi opsional yang memungkinkan baris ini bekerja.
Membuat opsional
Menggunakan
?
untuk membuat opsional adalah gula sintaksis, diaktifkan oleh kompiler Swift. Jika Anda ingin melakukannya jauh, Anda dapat membuat opsional seperti ini:Optional
Inisialisasi pertama panggilan inipublic init(_ some: Wrapped)
, yang menyimpulkan jenis yang terkait opsional dari jenis yang digunakan dalam tanda kurung.Cara lebih lama untuk membuat dan mengatur opsional:
Pengaturan opsional untuk
nil
Anda dapat membuat opsional tanpa nilai awal, atau membuatnya dengan nilai awal
nil
(keduanya memiliki hasil yang sama).Mengizinkan opsional sama
nil
dengan diaktifkan oleh protokolExpressibleByNilLiteral
(sebelumnya bernamaNilLiteralConvertible
). Opsional dibuat denganOptional
penginisialisasi keduapublic init(nilLiteral: ())
,. Dokumen mengatakan bahwa Anda tidak boleh menggunakanExpressibleByNilLiteral
apa pun kecuali opsional, karena itu akan mengubah arti nihil dalam kode Anda, tetapi dimungkinkan untuk melakukannya:Protokol yang sama memungkinkan Anda untuk mengatur opsional yang sudah dibuat
nil
. Meskipun tidak disarankan, Anda dapat menggunakan penginisialisasi literal nil secara langsung:Membandingkan opsional untuk
nil
Opsional menentukan dua operator "==" dan "! =" Khusus, yang dapat Anda lihat dalam
Optional
definisi. Yang pertama==
memungkinkan Anda untuk memeriksa apakah ada opsi yang sama dengan nol. Dua opsional berbeda yang disetel ke .tidak akan selalu sama jika jenis terkait adalah sama. Ketika Anda membandingkan dengan nol, di belakang layar Swift membuat opsional dari jenis terkait yang sama, diatur ke. Tidak ada yang kemudian menggunakannya untuk perbandingan.==
Operator kedua memungkinkan Anda untuk membandingkan dua opsional. Keduanya harus tipe yang sama dan tipe tersebut harus sesuaiEquatable
(protokol yang memungkinkan membandingkan hal-hal dengan operator "==" reguler). Swift (mungkin) membuka dua nilai dan membandingkannya secara langsung. Ini juga menangani case di mana satu atau kedua opsional berada.none
. Perhatikan perbedaan antara membandingkan dengannil
literal.Selain itu, ini memungkinkan Anda untuk membandingkan
Equatable
jenis apa pun dengan pembungkus opsional jenis itu:Di belakang layar, Swift membungkus non-opsional sebagai opsional sebelum perbandingan. Ia bekerja dengan literal juga (
if 23 == numberFromString {
)Saya mengatakan ada dua
==
operator, tetapi sebenarnya ada sepertiga yang memungkinkan Anda untuk menempatkannil
di sisi kiri perbandinganMemilih Penamaan
Tidak ada konvensi Swift untuk penamaan tipe opsional berbeda dari tipe non-opsional. Orang menghindari menambahkan sesuatu ke nama untuk menunjukkan bahwa itu adalah opsional (seperti "opsionalMiddleName", atau "possibleNumberAsString") dan biarkan deklarasi menunjukkan bahwa itu adalah tipe opsional. Ini menjadi sulit ketika Anda ingin memberi nama sesuatu untuk menyimpan nilai dari opsional. Nama "middleName" menyiratkan bahwa itu adalah tipe String, jadi ketika Anda mengekstrak nilai String dari itu, Anda sering dapat berakhir dengan nama-nama seperti "actualMiddleName" atau "unwrappedMiddleName" atau "realMiddleName". Gunakan penjilidan opsional dan gunakan kembali nama variabel untuk menyiasatinya.
Definisi resmi
Dari "The Basics" dalam Bahasa Pemrograman Swift :
Untuk menyelesaikannya, inilah puisi dari tahun 1899 tentang opsional:
Kemarin di tangga
saya bertemu dengan seorang pria yang tidak ada di sana.
Dia tidak ada di sana lagi hari ini
saya berharap, saya berharap dia akan pergi
Antigonish
Sumber lainnya:
sumber
if myString
tidak lagi dikompilasi. Kamu butuhif myString != nil
. Lihat dokumentasi .Mari kita ambil contoh
NSError
, jika tidak ada kesalahan yang dikembalikan Anda ingin menjadikannya opsional untuk mengembalikan nol. Tidak ada gunanya memberikan nilai padanya jika tidak ada kesalahan ..Ini juga memungkinkan Anda untuk memiliki nilai default. Jadi, Anda dapat menetapkan metode nilai default jika fungsi tidak lulus apa pun
sumber
func isNil<T>(t: T?) -> Bool { return t == nil }
akan kembalitrue
bahkan jika ada nilai opsional yang adanil
dalam ekspresi.return x == 5
? Apa yang istimewa dari 5?Anda tidak dapat memiliki variabel yang mengarah ke
nil
Swift - tidak ada pointer, dan tidak ada pointer nol. Namun dalam API, Anda sering ingin dapat menunjukkan jenis nilai tertentu, atau kurangnya nilai - misalnya apakah jendela saya memiliki delegasi, dan jika ya, siapa itu? Opsional adalah jenis Swift yang aman dan aman untuk melakukan hal ini.sumber
Saya membuat jawaban singkat, yang meringkas sebagian besar di atas, untuk membersihkan ketidakpastian yang ada di kepala saya sebagai pemula:
Diseberang ke Objective-C, tidak ada variabel yang dapat mengandung nil di Swift, jadi tipe variabel opsional ditambahkan (variabel yang didekenisasi oleh "?"):
Perbedaan besar adalah bahwa variabel opsional tidak secara langsung menyimpan nilai (seperti variabel Obj-C normal) mereka mengandung dua status : " memiliki nilai " atau " memiliki nihil ":
Oleh karena itu, Anda dapat memeriksa variabel-variabel tersebut dalam situasi yang berbeda:
Dengan menggunakan "!" akhiran, Anda juga dapat mengakses nilai yang dibungkus di dalamnya, hanya jika ada . (Yaitu tidak nol ):
Itu sebabnya Anda perlu menggunakan "?" dan "!" dan tidak menggunakan semuanya secara default. (Ini adalah kebingungan terbesar saya)
Saya juga setuju dengan jawaban di atas: Jenis opsional tidak dapat digunakan sebagai boolean .
sumber
Dalam variabel C objektif tanpa nilai sama dengan 'nil' (juga dimungkinkan untuk menggunakan nilai 'nil' sama dengan 0 dan salah), maka dimungkinkan untuk menggunakan variabel dalam pernyataan bersyarat (Variabel yang memiliki nilai sama dengan 'BENAR' 'dan mereka yang tidak memiliki nilai sama dengan' SALAH ').
Swift memberikan keamanan jenis dengan memberikan 'nilai opsional'. yaitu mencegah kesalahan yang terbentuk dari menetapkan variabel dari jenis yang berbeda.
Jadi di Swift, hanya boolean yang dapat diberikan pada pernyataan bersyarat.
Di sini, meskipun 'hw' adalah string, itu tidak dapat digunakan dalam pernyataan if seperti dalam objektif C.
Untuk itu perlu dibuat sebagai,
sumber
Nilai opsional memungkinkan Anda menunjukkan tidak adanya nilai. Sedikit seperti NULL di SQL atau NSNull di Objective-C. Saya kira ini akan menjadi peningkatan karena Anda dapat menggunakan ini bahkan untuk tipe "primitif".
Kutipan dari: Apple Inc. “Bahasa Pemrograman Swift.” iBooks. https://itun.es/gb/jEUH0.l
sumber
nil
hanyalah gula sintaksis untuk konstanta enumOptionalValue<T>.None
(di manaT
jenis yang sesuai dengan konteks tempat Anda menggunakannil
)?
adalah jalan pintas untukOptionalValue<T>.Some(T)
.Pilihan berarti bahwa Swift tidak sepenuhnya yakin apakah nilainya sesuai dengan tipe: misalnya, Int? berarti Swift tidak sepenuhnya yakin apakah angka itu adalah Int.
1) Jika Anda benar-benar yakin dengan jenisnya, Anda dapat menggunakan tanda seru untuk memaksa membuka bungkusnya, seperti ini:
Jika Anda memaksanya membuka bungkusan opsional dan sama dengan nihil, Anda mungkin mengalami kesalahan kerusakan ini:
Ini belum tentu aman, jadi inilah metode yang mungkin mencegah crash jika Anda tidak yakin dengan jenis dan nilai:
2) Pilihan Tersirat yang Tidak Dibungkus
3) Pernyataan penjaga
Dari sini, Anda dapat melanjutkan dan menggunakan variabel yang tidak terbuka. Pastikan hanya untuk memaksa membuka (dengan!), Jika Anda yakin dengan jenis variabel.
sumber
Ketika saya mulai belajar
Swift
, sangat sulit untuk menyadari mengapa opsional .Mari kita berpikir dengan cara ini. Mari pertimbangkan kelas
Person
yang memiliki dua propertiname
dancompany
.Sekarang mari kita buat beberapa objek
Person
Tapi kita tidak bisa lewat
Nil
kename
Sekarang mari kita bicara tentang mengapa kita menggunakan
optional?
. Mari kita pertimbangkan situasi di mana kita ingin menambahkanInc
setelah nama perusahaanapple
akanapple Inc
. Kita perlu menambahkanInc
setelah nama perusahaan dan cetak.Sekarang mari kita pelajari mengapa opsional terjadi.
Mari kita ganti
bob
dengantom
Dan Selamat! kami telah berurusan dengan benar
optional?
Jadi poin realisasi adalah
nil
nil
.Terima kasih ... Selamat Coding
sumber
Mari Bereksperimen dengan kode Playground di bawah ini. Saya harap akan menjernihkan ide apa yang opsional dan alasan menggunakannya.
sumber
Dari https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/OptionalChaining.html :
Untuk memahami lebih dalam, baca tautan di atas.
sumber
Baik...
Perbedaan utama adalah bahwa rantai opsional gagal dengan anggun ketika opsional adalah nol, sedangkan membuka paksa dipaksa memicu kesalahan runtime ketika opsional adalah nol.
Untuk mencerminkan fakta bahwa perangkaian opsional dapat dipanggil pada nilai nihil, hasil dari perangkaian panggilan opsional selalu merupakan nilai opsional, bahkan jika properti, metode, atau subskrip yang Anda query mengembalikan nilai non-opsional. Anda dapat menggunakan nilai pengembalian opsional ini untuk memeriksa apakah panggilan chaining opsional berhasil (opsional kembali berisi nilai), atau tidak berhasil karena nilai nol di rantai (nilai opsional yang dikembalikan adalah nol).
Secara khusus, hasil dari panggilan chaining opsional adalah jenis yang sama dengan nilai pengembalian yang diharapkan, tetapi dibungkus dengan opsional. Properti yang biasanya mengembalikan Int akan mengembalikan Int? ketika diakses melalui perangkaian opsional.
Berikut ini adalah tutorial dasar secara rinci, oleh Komite Pengembang Apple: Chaining Opsional
sumber
Opsional dalam Swift adalah jenis yang dapat menyimpan nilai atau tidak ada nilai. Opsional ditulis dengan menambahkan ? untuk semua jenis:
Anda dapat merujuk ke tautan ini untuk mendapatkan pengetahuan secara mendalam: https://medium.com/@agoiabeladeyemi/optionals-in-swift-2b141f12f870
sumber
Berikut adalah deklarasi opsional yang setara di Swift:
Deklarasi ini membuat variabel bernama middleName of type String. Tanda tanya (?) Setelah tipe variabel String menunjukkan bahwa variabel middleName dapat berisi nilai yang bisa berupa String atau nihil. Siapa pun yang melihat kode ini segera tahu bahwa middleName dapat nihil. Ini mendokumentasikan diri!
Jika Anda tidak menentukan nilai awal untuk konstanta opsional atau variabel (seperti yang ditunjukkan di atas) nilai secara otomatis ditetapkan ke nol untuk Anda. Jika Anda suka, Anda dapat secara eksplisit mengatur nilai awal menjadi nihil:
untuk lebih detail untuk tautan baca di bawah opsional
http://www.iphonelife.com/blog/31369/swift-101-working-swifts-new-optional-values
sumber