as
digunakan untuk upcasting dan tipe casting untuk tipe bridged
as?
digunakan untuk casting yang aman, kembalikan nihil jika gagal
as!
digunakan untuk memaksa casting, crash jika gagal
catatan:
as!
tidak dapat mengubah tipe mentah menjadi opsional
Contoh:
let rawString: AnyObject = "I love swift"
let optionalString: AnyObject? = "we love swift"
let nilString: AnyObject? = (nil as String?)
let rawInt: AnyObject = Int(3)
let optionalInt: AnyObject? = Int(3)
let nilInt: AnyObject? = (nil as Int?)
Contoh
var age: Int? = nil
var height: Int? = 180
Dengan menambahkan ? segera setelah tipe data Anda memberi tahu compiler bahwa variabel mungkin berisi angka atau tidak. Rapi! Perhatikan bahwa tidak masuk akal untuk mendefinisikan konstanta Opsional - Anda dapat menyetel nilainya hanya sekali dan oleh karena itu Anda akan dapat mengatakan apakah nilainya akan menjadi nil atau tidak.
Kapan kita harus menggunakan "?" dan kapan "!"
katakanlah kita memiliki aplikasi sederhana berbasis UIKit. kami memiliki beberapa kode di pengontrol tampilan kami dan ingin menampilkan pengontrol tampilan baru di atasnya. dan kami perlu memutuskan untuk menampilkan tampilan baru di layar menggunakan pengontrol navigasi.
Seperti yang kita ketahui, setiap instance ViewController memiliki pengontrol navigasi properti. Jika Anda membangun aplikasi berbasis pengontrol navigasi, properti pengontrol tampilan utama aplikasi Anda disetel secara otomatis dan Anda dapat menggunakannya untuk mendorong atau memunculkan pengontrol tampilan. Jika Anda menggunakan template proyek aplikasi tunggal - tidak akan ada pengontrol navigasi yang dibuat secara otomatis untuk Anda, sehingga pengontrol tampilan default aplikasi Anda tidak akan menyimpan apa pun di properti navigationController.
Saya yakin Anda sudah menebak bahwa ini persis kasus untuk tipe data Opsional. Jika Anda memeriksa UIViewController Anda akan melihat bahwa properti tersebut didefinisikan sebagai:
var navigationController: UINavigationController? { get }
Jadi mari kita kembali ke kasus penggunaan kita. Jika Anda mengetahui fakta bahwa pengontrol tampilan Anda akan selalu memiliki pengontrol navigasi, Anda dapat melanjutkan dan membukanya secara paksa:
controller.navigationController!.pushViewController(myViewController, animated: true)
Saat Anda meletakkan! di belakang nama properti Anda memberi tahu kompiler Saya tidak peduli bahwa properti ini opsional, saya tahu bahwa ketika kode ini dijalankan akan selalu ada penyimpanan nilai jadi perlakukan Opsional ini seperti tipe data normal. Bukankah itu bagus? Apa yang akan terjadi jika tidak ada pengontrol navigasi ke pengontrol tampilan Anda? Jika saran Anda bahwa akan selalu ada nilai yang disimpan di navigationController salah? Aplikasi Anda akan mogok. Sederhana dan jelek seperti itu.
Jadi, gunakan! hanya jika Anda 101% yakin bahwa ini aman.
Bagaimana jika Anda tidak yakin bahwa akan selalu ada pengontrol navigasi? Lalu Anda bisa menggunakan? bukannya!:
controller.navigationController?.pushViewController(myViewController, animated: true)
Apa itu? di belakang nama properti memberitahu kompiler adalah Saya tidak tahu apakah properti ini berisi nil atau nilai, jadi: jika memiliki nilai, gunakan itu, dan jika tidak, pertimbangkan seluruh ekspresi nil.Secara efektif? memungkinkan Anda menggunakan properti itu kalau-kalau ada pengontrol navigasi. Tidak, jika pemeriksaan dalam bentuk apa pun atau coran apa pun. Sintaks ini sempurna saat Anda tidak peduli apakah Anda memiliki pengontrol navigasi atau tidak, dan ingin melakukan sesuatu hanya jika ada.
Terima kasih banyak untuk Fantageek