Swift menempatkan premi tinggi pada keamanan jenis. Seluruh bahasa Swift dirancang dengan mempertimbangkan keselamatan. Ini adalah salah satu ciri khas Swift dan yang harus Anda sambut dengan tangan terbuka. Ini akan membantu dalam pengembangan kode yang bersih dan mudah dibaca serta membantu menjaga aplikasi Anda agar tidak macet.
Semua opsional di Swift ditandai dengan ?
simbol. Dengan mengatur ?
setelah nama tipe yang Anda deklarasikan sebagai opsional, Anda pada dasarnya casting ini bukan sebagai tipe yang sebelum ?
, tetapi sebagai tipe opsional .
Catatan: Sebuah variabel atau jenis Int
adalah tidak sama dengan Int?
. Mereka adalah dua jenis berbeda yang tidak dapat dioperasikan satu sama lain.
Menggunakan Opsional
var myString: String?
myString = "foobar"
Ini tidak berarti bahwa Anda bekerja dengan tipe String
. Ini berarti bahwa Anda bekerja dengan jenis String?
(String Opsional, atau Opsional String). Bahkan, kapan pun Anda berusaha
print(myString)
saat runtime, konsol debug akan dicetak Optional("foobar")
. Bagian " Optional()
" menunjukkan bahwa variabel ini mungkin atau mungkin tidak memiliki nilai saat runtime, tetapi kebetulan saat ini mengandung string "foobar". Optional()
Indikasi ini " " akan tetap kecuali Anda melakukan apa yang disebut "membuka" nilai opsional.
Membuka gulungan suatu opsi berarti bahwa Anda sekarang menggunakan tipe itu sebagai non-opsional. Ini akan menghasilkan tipe baru dan menetapkan nilai yang berada di dalam opsional itu ke jenis non-opsional baru. Dengan cara ini Anda dapat melakukan operasi pada variabel itu karena telah dijamin oleh kompiler untuk memiliki nilai yang solid.
Dibuka dengan syarat akan memeriksa apakah nilai dalam opsional nil
atau tidak. Jika tidak nil
, akan ada variabel konstan yang baru dibuat yang akan diberi nilai dan dibuka ke konstanta non-opsional. Dan dari sana Anda dapat dengan aman menggunakan non-opsional di if
blok.
Catatan: Anda dapat memberikan konstanta membuka bungkus yang kondisional Anda dengan nama yang sama dengan variabel opsional yang Anda buka bungkus.
if let myString = myString {
print(myString)
// will print "foobar"
}
Opsional yang terbuka secara kondisional adalah cara terbersih untuk mengakses nilai opsional karena jika mengandung nilai nil maka semua yang ada di dalam blok if let tidak akan dieksekusi. Tentu saja, seperti pernyataan if apa pun, Anda dapat menyertakan blok lain
if let myString = myString {
print(myString)
// will print "foobar"
}
else {
print("No value")
}
Membuka paksa secara paksa dilakukan dengan menggunakan apa yang dikenal sebagai !
operator ("bang"). Ini kurang aman tetapi masih memungkinkan kode Anda untuk dikompilasi. Namun setiap kali Anda menggunakan operator bang Anda harus yakin 1000% bahwa variabel Anda sebenarnya mengandung nilai yang solid sebelum membuka paksa.
var myString: String?
myString = "foobar"
print(myString!)
Ini di atas sepenuhnya kode Swift yang valid. Mencetak nilaimyString
yang ditetapkan sebagai "foobar". Pengguna akan melihat foobar
tercetak di konsol dan hanya itu saja. Tapi mari kita asumsikan nilainya tidak pernah ditetapkan:
var myString: String?
print(myString!)
Sekarang kami memiliki situasi yang berbeda di tangan kami. Tidak seperti Objective-C, setiap kali ada upaya untuk membuka paksa opsional, dan opsional belum diatur dan nil
, ketika Anda mencoba untuk membuka opsional untuk melihat apa yang ada di dalam aplikasi Anda akan crash.
Buka gulungan dg Tipe Casting . Seperti yang telah kami katakan sebelumnya bahwa meskipun Anda adalah unwrapping
opsional, Anda benar-benar melakukan casting ke tipe non-opsional, Anda juga dapat melemparkan non-opsional ke jenis yang berbeda. Sebagai contoh:
var something: Any?
Di suatu tempat dalam kode kita, variabel something
akan diatur dengan beberapa nilai. Mungkin kita menggunakan obat generik atau mungkin ada logika lain yang terjadi yang akan menyebabkan ini berubah. Jadi nanti dalam kode kita, kita ingin menggunakan something
tetapi masih dapat memperlakukannya secara berbeda jika itu adalah jenis yang berbeda. Dalam hal ini Anda ingin menggunakanas
kata kunci untuk menentukan ini:
Catatan: as
Operator adalah cara Anda mengetik gips dalam Swift.
// Conditionally
if let thing = something as? Int {
print(thing) // 0
}
// Optionally
let thing = something as? Int
print(thing) // Optional(0)
// Forcibly
let thing = something as! Int
print(thing) // 0, if no exception is raised
Perhatikan perbedaan antara kedua as
kata kunci tersebut. Seperti sebelumnya ketika kami secara paksa membuka bungkusan opsional, kami menggunakan !
operator letusan untuk melakukannya. Di sini Anda akan melakukan hal yang sama tetapi alih-alih melakukan casting sebagai non-opsional, Anda juga melakukan casting Int
. Dan itu harus dapat dibatalkan karena Int
, jika tidak, seperti menggunakan operator bang ketika nilainya nil
aplikasi Anda akan crash.
Dan untuk menggunakan variabel-variabel ini sama sekali dalam semacam operasi matematika mereka harus dibuka untuk melakukannya.
Sebagai contoh, dalam Swift hanya tipe data angka yang valid dari jenis yang sama dapat dioperasikan satu sama lain. Ketika Anda melemparkan sebuah tipe dengan as!
Anda memaksa downcast variabel itu seolah-olah Anda yakin itu adalah tipe itu, karena itu aman untuk beroperasi dan tidak crash aplikasi Anda. Ini boleh saja asalkan variabelnya memang dari tipe yang Anda gunakan, jika tidak, Anda akan memiliki kekacauan di tangan Anda.
Meskipun demikian casting dengan as!
akan memungkinkan kode Anda untuk dikompilasi. Dengan casting dengan as?
cerita yang berbeda. Bahkan, as?
nyatakan bahwa Anda Int
adalah tipe data yang sama sekali berbeda.
Sekarang sudah Optional(0)
Dan jika Anda pernah mencoba mengerjakan pekerjaan rumah Anda menulis sesuatu seperti
1 + Optional(1) = 2
Guru matematika Anda kemungkinan memberi Anda "F". Sama dengan Swift. Kecuali Swift lebih suka tidak mengkompilasi sama sekali daripada memberi Anda nilai. Karena pada akhirnya hari opsional mungkin sebenarnya nol .
Safety First Kids.