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) // 6History 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
- Membuat pembungkus, projectedValue
- Keterpakaian ulang dan batasan
- Pola pembungkus umum (validasi, penyimpanan sementara)