Type Casting

Pada tulisan ini kita akan mempelajari bagaimana melakukan konversi tipe-tipe dalam object yang terbentuk dari Class dan Struct. Jika kamu pengguna Storyboard kamu harus tahu apa itu type casting.
Masalah
Bagaimana kamu membedakan antara as, as? dan as!?
Type Casting dalam UIKit
import UIKit let label = UILabel() as UIView
Kamu telah mengkonversi UILabel ke UIView. UILabel adalah subclass dari UIView. Kita akan mencoba membuat replika dari kejadian di atas dengan menggunakan custom class.

Class Human
Buat sebuah class Human yang berisi 1 fungsi.
class Human {
func introduce() {
print("Hi, I'm a human")
}
}Subclass Human
Buat class Indonesian dan Japanese inherit dari class Human.
class Indonesian: Human {
func singDangdut() {
print("Dangdutan mang")
}
}
class Japanese: Human {
func doNinja() {
print("Shhh.....")
}
}Buat implementasinya, pastikan semua berjalan
let tejo = Indonesian() tejo.introduce() // "Hi, I'm a human" tejo.singDangdut() // "Dangdutan mang"
Type Casting
Kamu dapat mengkonversi Indonesian ke Human atau sebaliknya. Terdapat 2 cara yaitu upcasting dan downcasting.
Upcasting
Upcasting terjadi ketika sebuah object dikonversi ke kelas dasarnya. Diawal tadi sudah dijelaskan UILabel ke UIView menggunakan as.
let newTejo = tejo as Human // Indonesian -> Human newTejo.introduce() newTejo.singDangdut() // Does not exist
Contoh Upcasting dalam Struct
var name = "Asep" as Any var number = 20 as Any var anyArray = [name, number] // [Any]
IntdanStringadalah tipe struct yang tidak memiliki kelas dasar. Namun, struct hanya boleh “upcast” keAny.
Downcasting
Downcasting adalah kebalikannya. Kamu dapat menurunkan Any ke String. Namun, ini mungkin gagal karena Any dapat berisi banyak jenis. Analog dengan opsional, ada dua cara untuk downcast: Force downcasting atau implisit downcasting.
Force Downcasting
Mengembalikan tipe normal. Jika gagal akan crash..
// Force Downcasting let newValue = anyArray[0] as! String let newValue = anyArray[1] as! String // Crash
Implicit Downcasting
Mengembalikan tipe optional. Jika gagal mengembalikan nil.
let newNewValue = anyArray[0] as? Int print(newNewValue) // Optional(20)
Contoh Lain
Untuk mengambil viewcontroller dari Storyboard, downcast untuk mengidentifikasi viewcontroller yang ditunjuk.
let storyboard = UIStoryboard(name: "Main", bundle: nil) let vc = storyboard instantiateViewController(withIdentifier: "VC") // type of vc = UIViewController let vc = storyboard instantiateViewController(withIdentifier: "VC") as! VC // type of vc = VC
Semoga bermanfaat.
