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.

Hirarki UIKit Framework

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 dan Stringadalah tipe struct yang tidak memiliki kelas dasar. Namun, struct hanya boleh “upcast” ke Any.

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.

0 0 votes
Rating
Subscribe
Notify of
guest
0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments

0
Would love your thoughts, please comment.x
()
x