Swift Academy · Pelajaran

some P (tipe hasil opak): menyembunyikan tipe konkret

Kembalikan some P untuk menyembunyikan tipe hasil konkret sambil menjamin bahwa tipe tersebut memenuhi P ; pemanggil memperoleh kinerja tipe statis tanpa mengekspos implementasi.

Pelajaran 1 dari 38 langkah

some P (tipe hasil opak): menyembunyikan tipe konkret adalah pelajaran Swift Academy gratis di CoddyKit. Ini adalah pelajaran 1 dari 3. 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 3 pelajaran total.

Mengapa tipe hasil opak?

Tipe hasil opak menggunakan some P untuk menyembunyikan tipe konkret di balik protokol. Tipe konkret tersebut tetap untuk fungsi itu, tetapi pemanggil hanya melihat antarmuka protokolnya.

  • Enkapsulasi tanpa kehilangan kinerja statis
  • Sangat cocok untuk pabrik dan API mirip DSL

Pabrik opak dasar

makeUnitCircle() mengembalikan some Shape. Pemanggil dapat memanggil area(), tetapi tidak dapat bergantung pada tipe konkretnya.

protocol Shape {
    func area() -> Double
}
struct Circle: Shape {
    let r: Double
    func area() -> Double { .pi * r * r }
}
struct Square: Shape {
    let s: Double
    func area() -> Double { s * s }
}

// Opaque factory: callers know it's a Shape, not which one
func makeUnitCircle() -> some Shape {
    Circle(r: 1.0)    // concrete type is hidden
}

let sh = makeUnitCircle()
print(String(format: "%.2f", sh.area()))  // 3.14

Tetap untuk setiap fungsi

Tipe tersembunyi tersebut tetap untuk setiap fungsi. Fungsi lain yang mengembalikan some Shape dapat menyembunyikan tipe konkret yang berbeda.

// Each function using "some Shape" chooses one hidden concrete type.
// Within the same function, it must always be the same concrete type.
func makeSquare(side: Double) -> some Shape {
    Square(s: side)   // fixed to Square for this function
}

let a = makeUnitCircle()
let b = makeUnitCircle()
print(a.area() == b.area())  // true for two unit circles

let q = makeSquare(side: 2)
print(q.area())              // 4.0

Hanya satu tipe tersembunyi

Aturan: fungsi dengan nilai kembalian opak harus mengembalikan tipe konkret yang sama pada semua jalur. Cabang berbeda → kesalahan kompilasi.

// ❌ This would NOT compile, because different branches return different concrete types:
// func makeShape(flag: Bool) -> some Shape {
//     if flag {
//         return Circle(r: 1)
//     } else {
//         return Square(s: 1) // error: underlying type must be the same
//     }
// }
// Rule: an opaque-returning function must always produce the same concrete type.

Opak dengan generik

Nilai kembalian opak dapat disusun bersama generik. Pemanggil melihat sebuah Shape, sementara Anda menjaga implementasi Scaled<Circle> tetap privat.

// A generic decorator that also conforms to Shape
struct Scaled<S: Shape>: Shape {
    let base: S
    let k: Double
    func area() -> Double { base.area() * k * k }
}

// Factory still hides the concrete generic type
func makeScaledUnitCircle(k: Double) -> some Shape {
    Scaled(base: Circle(r: 1.0), k: k)
}

let s1 = makeScaledUnitCircle(k: 2)
print(s1.area())  // 4 * π

Kapan memilih tipe opak

Gunakan tipe opak ketika:

  • Anda ingin menyembunyikan implementasi tetapi tetap mempertahankan pengetikan statis.
  • API harus mengembalikan tampilan protokol (misalnya, Shape) tanpa mengekspos tipe konkret.
  • Anda membuat alur pemrosesan/DSL yang merangkai pembangun sambil tetap generik.

(Anda akan membandingkannya dengan tipe eksistensial pada pelajaran berikutnya.)

Definisi hasil opak

Pemeriksaan singkat: Apa yang dijamin oleh some P?

Ringkasan

Ringkasan: Tipe hasil opak (some P) menyembunyikan tipe konkret, tetapi tetap mempertahankan dispatch statis. Tipe dasarnya tetap untuk setiap fungsi; gunakan tipe ini untuk API yang bersih, cepat, dan terenkapsulasi.

Gratis untuk memulai

Belajar Swift dengan tutor AI — gratis

Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.

Kursus
122
Pelajaran
409

Pertanyaan yang Sering Diajukan

Apakah pelajaran “some P (tipe hasil opak): menyembunyikan tipe konkret” gratis?

Ya — teks lengkap “some P (tipe hasil opak): menyembunyikan tipe konkret” 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 3 pelajaran total.

Apa yang akan aku pelajari di “some P (tipe hasil opak): menyembunyikan tipe konkret”?

Kembalikan some P untuk menyembunyikan tipe hasil konkret sambil menjamin bahwa tipe tersebut memenuhi P ; pemanggil memperoleh kinerja tipe statis tanpa mengekspos implementasi. 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 1 dari 3.

Berapa lama pelajaran “some P (tipe hasil opak): menyembunyikan tipe konkret” 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. some P (tipe hasil opak): menyembunyikan tipe konkret
  2. any P (eksistensial): kompromi dan pengiriman dinamis
  3. Memilih antara some, any, dan generik
← Kembali ke Swift Academy