0Pricing
Swift Academy · Pelajaran

Existential dengan any dan Penghapusan Tipe

Menggunakan any Protocol, biaya kinerjanya, dan kapan generik lebih disarankan.

Existential dengan any dan Penghapusan Tipe adalah pelajaran Swift Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Swift Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Swift Academy mencakup 4 pelajaran total.

Apa Itu Tipe Eksistensial?

Tipe eksistensial membungkus nilai apa pun yang memenuhi protokol di balik antarmuka seragam dan menyelesaikannya saat program berjalan.

protocol Drawable { func draw() }
struct Line: Drawable { func draw() { print("Line") } }
let d: any Drawable = Line()
d.draw()

Kata Kunci any

Swift 5.7 mewajibkan kata kunci any sebelum nama protokol yang digunakan sebagai tipe eksistensial agar pembungkusan tersebut terlihat jelas.

func render(_ shape: any Drawable) {
  shape.draw()
}
render(Line())

Biaya Tipe Eksistensial

Tipe eksistensial menggunakan alokasi memori dinamis dan pemanggilan dinamis, yang dapat lebih lambat daripada generik dengan pemanggilan statis.

// Existential – dynamic dispatch, potential heap alloc
var shapes: [any Drawable] = [Line(), Line()]
// Generic – static dispatch, no boxing
func drawGeneric<T: Drawable>(_ s: T) { s.draw() }

Masalah PAT dan Tipe Eksistensial

Protokol dengan tipe terkait (PAT) tidak dapat digunakan sebagai eksistensial polos tanpa penghapusan tipe.

protocol Container { associatedtype Item }
// var c: any Container // Swift 5.7 allows with "any" but loses Item info

Pola Penghapusan Tipe

Pembungkus yang menghapus tipe membungkus tipe konkret di balik sebuah struct sehingga tipe konkret tersebut tersembunyi.

struct AnyDrawable: Drawable {
  private let _draw: () -> Void
  init<D: Drawable>(_ d: D) { _draw = d.draw }
  func draw() { _draw() }
}

AnySequence dan AnyPublisher

Pustaka standar Swift dan Combine menyediakan pembungkus yang menghapus tipe, seperti AnySequence dan AnyPublisher.

import Combine
let subject = PassthroughSubject<Int, Never>()
let pub: AnyPublisher<Int, Never> = subject.eraseToAnyPublisher()

eraseToAnyPublisher()

eraseToAnyPublisher() menyembunyikan rangkaian publisher konkret sehingga pemanggil hanya bergantung pada AnyPublisher.

func fetch() -> AnyPublisher<String, Error> {
  URLSession.shared.dataTaskPublisher(for: URL(string: "https://example.com")!)
    .map { String(data: $0.data, encoding: .utf8) ?? "" }
    .eraseToAnyPublisher()
}

Kapan Eksistensial Tepat Digunakan

Gunakan eksistensial untuk koleksi heterogen atau ketika tipe persisnya belum diketahui saat kompilasi.

var widgets: [any Drawable] = [] // mixed concrete types OK

Utamakan Generik daripada Eksistensial

Jika memungkinkan, ganti eksistensial dengan generik untuk memperoleh pengiriman statis dan performa yang lebih baik.

// Prefer this:
func draw<T: Drawable>(_ item: T) { item.draw() }
// Over this:
func draw(_ item: any Drawable) { item.draw() }

Membuka Eksistensial

Swift 5.7+ dapat "membuka" eksistensial saat memanggil fungsi generik, dengan otomatis mengekstrak tipe yang mendasarinya.

func drawGeneric<T: Drawable>(_ d: T) { d.draw() }
let d: any Drawable = Line()
drawGeneric(d) // compiler opens the existential automatically

Penghapusan Tipe vs Tipe Opak

Penghapusan tipe menyembunyikan tipe untuk penggunaan heterogen; tipe opak mempertahankan identitas untuk satu tipe hasil yang konsisten.

let erased: any Drawable = Line()   // runtime type unknown
let opaque: some Drawable = Line()   // compile-time fixed type

Pemeriksaan Singkat

Apa biaya performa utama dari tipe eksistensial?

Ringkasan Pelajaran

Eksistensial (any Protocol) memungkinkan polimorfisme saat eksekusi dengan konsekuensi pengiriman dinamis. Penghapusan tipe membungkus tipe konkret di balik antarmuka yang stabil. Utamakan generik untuk performa; gunakan eksistensial untuk koleksi heterogen.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Existential dengan any dan Penghapusan Tipe” gratis?

Ya — teks lengkap “Existential dengan any dan Penghapusan Tipe” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Swift Academy, upgrade ke CoddyKit PRO. Kursus Swift Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Existential dengan any dan Penghapusan Tipe”?

Menggunakan any Protocol, biaya kinerjanya, dan kapan generik lebih disarankan. Kamu berlatih Swift Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Swift Academy?

Tidak diperlukan pengalaman sebelumnya. Swift Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.

Berapa lama pelajaran “Existential dengan any dan Penghapusan Tipe” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Swift Academy ini?

Ya. Setiap pelajaran Swift Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Batasan Generik dan Klausa where
  2. Tipe Opaque dengan Kata Kunci some
  3. Existential dengan any dan Penghapusan Tipe
  4. Tipe Associated Utama dan Typed Throws
← Kembali ke Swift Academy