0Pricing
Swift Academy · Pelajaran

Membuat pembungkus, projectedValue

Buat pembungkus khusus, konfigurasikan wrappedValue , serta tampilkan metadata/helper dengan projectedValue ( $ ).

Membuat pembungkus, projectedValue 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 pembungkus properti?

Pembungkus properti adalah tipe yang dapat digunakan kembali untuk mengelola cara properti disimpan/dibaca:

  • wrappedValue: nilai publik
  • projectedValue: API tambahan melalui $
  • Konfigurasi melalui penginisialisasi/argumen

Clamped + penanda proyeksi

@Clamped membatasi angka pada suatu rentang. projectedValue ($hp) memberi tahu apakah penetapan terakhir dibatasi.

@propertyWrapper
struct Clamped {
    private var value: Int
    private let range: ClosedRange<Int>
    private(set) var wasClampedLastSet = false

    var wrappedValue: Int {
        get { value }
        set {
            let clamped = min(max(newValue, range.lowerBound), range.upperBound)
            wasClampedLastSet = (clamped != newValue)
            value = clamped
        }
    }

    var projectedValue: Bool { wasClampedLastSet } // $prop -> was it clamped?

    init(wrappedValue: Int, range: ClosedRange<Int>) {
        self.range = range
        let clamped = min(max(wrappedValue, range.lowerBound), range.upperBound)
        self.value = clamped
        self.wasClampedLastSet = (clamped != wrappedValue)
    }
}

struct Player {
    @Clamped(range: 0...100) var hp: Int = 120  // init clamps to 100
}

var p = Player()
print(p.hp)     // 100
p.hp = -5
print(p.hp, p.$hp)  // 0 true (was clamped)

Normalisasi & tampilan alternatif

Pembungkus dapat mengubah masukan (memangkas/mengubah menjadi huruf kecil). $property dapat mengekspos bentuk alternatif yang praktis.

@propertyWrapper
struct Normalized {
    private var storage: String = ""
    var wrappedValue: String {
        get { storage }
        set { storage = newValue.trimmingCharacters(in: .whitespacesAndNewlines).lowercased() }
    }
    var projectedValue: String { storage.uppercased() } // alternate view

    init(wrappedValue: String) { self.wrappedValue = wrappedValue }
}

struct User {
    @Normalized var username: String = "  Alice  "
}
let u = User()
print(u.username)   // "alice"
print(u.$username)  // "ALICE" (projected)

Pembungkus yang dapat dikonfigurasi

Berikan argumen kepada pembungkus (misalnya, panjang). Pembungkus menerapkan pemformatan setiap kali Anda menetapkan properti.

@propertyWrapper
struct Padded {
    private var value: String
    private let length: Int
    var wrappedValue: String {
        get { value }
        set {
            let s = newValue
            value = s.count >= length ? String(s.prefix(length))
                                      : s + String(repeating: " ", count: length - s.count)
        }
    }
    var projectedValue: Int { value.count } // current width
    init(wrappedValue: String, length: Int) {
        self.length = length
        self.value = ""
        self.wrappedValue = wrappedValue
    }
}

struct Row {
    @Padded(length: 6) var code: String = "AB"
}
var r = Row()
print("|\(r.code)|")   // |AB    |
print(r.$code)        // 6

History melalui $value

Gunakan projectedValue untuk mengekspos metadata seperti riwayat perubahan tanpa memenuhi API nilai utama.

@propertyWrapper
struct History<Value> {
    private var value: Value
    private(set) var changes: [Value] = []
    var wrappedValue: Value {
        get { value }
        set { changes.append(value); value = newValue }
    }
    var projectedValue: [Value] { changes } // $prop -> previous values
    init(wrappedValue: Value) { self.value = wrappedValue }
}

struct Settings {
    @History var level: Int = 1
}
var s = Settings()
s.level = 2
s.level = 3
print(s.level)    // 3
print(s.$level)   // [1, 2]

Panduan desain

Kiat:

  • Jaga pembungkus tetap kecil dan terfokus.
  • Dokumentasikan hal yang diekspos oleh $projectedValue.
  • Utamakan transformasi murni; hindari efek samping yang berat.
  • Sediakan penginisialisasi yang jelas dan nilai bawaan yang masuk akal.

Tujuan nilai proyeksi

Pemeriksaan singkat: Untuk apa $property digunakan dalam pembungkus?

Ringkasan

Ringkasan: Implementasikan @propertyWrapper dengan wrappedValue; ekspos pembantu/penanda/riwayat melalui projectedValue ($), dan konfigurasikan perilaku melalui penginisialisasi.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Membuat pembungkus, projectedValue” gratis?

Ya — teks lengkap “Membuat pembungkus, projectedValue” 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 “Membuat pembungkus, projectedValue”?

Buat pembungkus khusus, konfigurasikan wrappedValue , serta tampilkan metadata/helper dengan projectedValue ( $ ). 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 “Membuat pembungkus, projectedValue” 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. Membuat pembungkus, projectedValue
  2. Keterpakaian ulang dan batasan
  3. Pola pembungkus umum (validasi, penyimpanan sementara)
← Kembali ke Swift Academy