Dekorasi variabel cepat dengan "?" (tanda tanya) dan "!" (tanda seru)

106

Saya memahami bahwa di Swift semua variabel harus disetel dengan nilai, dan dengan menggunakan opsional kita dapat menyetel variabel untuk disetel pada nilawalnya.

Apa yang saya tidak mengerti adalah, apa yang dilakukan pengaturan variabel dengan a !, karena saya mendapat kesan bahwa ini "membuka" nilai dari opsional. Saya pikir dengan melakukan itu, Anda menjamin bahwa ada nilai untuk dibuka dalam variabel itu, itulah sebabnya di IBActions dan yang Anda lihat digunakan.

Jadi sederhananya, variabel apa yang diinisialisasi ketika Anda melakukan sesuatu seperti ini:

var aShape : CAShapeLayer!

Dan mengapa / kapan saya melakukan ini?

Jason Renaldo
sumber
Anda akan melakukan ini untuk mengetahui bahwa variabel adalah nt nil setelah Anda memeriksa fakta ini.
Matthias
Saya tidak berpikir ini harus ditandai sebagai duplikat. "Apa itu opsional?" bukan pertanyaan yang sama dengan "Apa perbedaan antara dua jenis pilihan?" yang cukup banyak apa ini yang dimaksud adalah
Jiaaro
@Jiaaro bahkan dalam kasus itu, sudah ada banyak pertanyaan tentang pilihan, pilihan yang secara implisit tidak terbungkus, dan sejenisnya. Anda juga dapat merujuk ke yang ini: stackoverflow.com/questions/24272781/…
Jack
@JackWu Oke, tapi saya cukup yakin pertanyaan ini bukan duplikat ketika ditanyakan. (itu ditanyakan seminggu penuh sebelum contoh Anda, misalnya)
Jiaaro
@Jiaaro Anda membuat poin yang baik, saya tidak melihat ini lebih tua..mungkin yang lain harus ditandai sebagai duplikat dari yang ini saja ..
Jack

Jawaban:

145

Dalam deklarasi tipe !mirip dengan ?. Keduanya opsional, tetapi opsional !" secara implisit tidak dibungkus" , yang berarti Anda tidak perlu membukanya untuk mengakses nilai (tetapi nilainya masih bisa nihil).

Ini pada dasarnya adalah perilaku yang sudah kami miliki di objektif-c. Sebuah nilai bisa nihil, dan Anda harus memeriksanya, tetapi Anda juga dapat mengakses nilai secara langsung seolah-olah itu bukan opsional (dengan perbedaan penting bahwa jika Anda tidak memeriksa nil Anda akan mendapatkan kesalahan waktu proses)

// Cannot be nil
var x: Int = 1

// The type here is not "Int", it's "Optional Int"
var y: Int? = 2

// The type here is "Implicitly Unwrapped Optional Int"
var z: Int! = 3

Pemakaian:

// you can add x and z
x + z == 4

// ...but not x and y, because y needs to be unwrapped
x + y // error

// to add x and y you need to do:
x + y!

// but you *should* do this:
if let y_val = y {
    x + y_val
}
Jiaaro
sumber
7
Opsional yang tidak terbungkus secara implisit dijelaskan di bagian bernama tepat yang dimulai pada halaman 56 dari The Swift Programming Language .
Kaleb
@Caleb Saya telah menambahkan tautan ke bagian yang relevan dari dokumen online di mana saya sebutkan secara implisit opsional yang belum dibuka :)
Jiaaro
Informasi bagus, terima kasih. Secara umum menyukai keamanan yang diberlakukan Swift sejauh ini, seharusnya menghasilkan lebih sedikit bug :).
Jason Renaldo
@Jiaaro: Terima kasih banyak telah berbagi. Itu membuat pengguna untuk memahami dengan sempurna dengan contoh di atas. !! :)
Esha
3
Menurut saya kalimat " Ini pada dasarnya adalah perilaku yang sudah kita miliki di objektif-c " bisa membingungkan. Dalam tujuan-c, seseorang dapat mengakses nilnilai dan benar-benar "bekerja" dengannya, dengan cepat mengakses opsional yang tidak terbungkus secara implisit sementara nilainya nihil akan memunculkan pengecualian waktu proses.
Sascha Wolf