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]
Int
danString
adalah 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.