0Pricing
Swift Academy · บทเรียน

การประกอบพร็อพเพอร์ตีแรปเปอร์หลายรายการ

ซ้อนพร็อพเพอร์ตีแรปเปอร์และทำความเข้าใจลำดับการเริ่มต้น

การประกอบพร็อพเพอร์ตีแรปเปอร์หลายรายการ เป็นบทเรียน Swift Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Swift Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Swift Academy มีบทเรียนทั้งหมด 4 บทเรียน

ยินดีต้อนรับ

สามารถใช้ตัวห่อหุ้มพร็อพเพอร์ตีหลายตัวกับพร็อพเพอร์ตีเดียวได้ ลำดับมีความสำคัญ ตัวห่อหุ้มด้านนอกจะครอบตัวห่อหุ้มด้านใน และลำดับการเริ่มต้นจะเป็นไปตามลำดับการประกาศ

การซ้อนตัวห่อหุ้ม

```swift @propertyWrapper struct A { var wrappedValue: Int { didSet { print("A") } } init(wrappedValue: Int) { self.wrappedValue = wrappedValue } } @propertyWrapper struct B { var wrappedValue: Int { didSet { print("B") } } init(wrappedValue: Int) { self.wrappedValue = wrappedValue } } struct S { @A @B var x = 0 } ```

ตัวห่อหุ้มด้านนอกครอบตัวห่อหุ้มด้านใน

เมื่อเขียน `@A @B var x` การคลี่รูปแบบโดยนัยจะเป็น: ```swift var _x: A> = A(wrappedValue: B(wrappedValue: 0)) ``` A ครอบ B ซึ่งครอบ Int

ตัวอย่างจริง: @NonEmpty + @Trimmed

```swift @propertyWrapper struct Trimmed { var wrappedValue: String { didSet { wrappedValue = wrappedValue.trimmingCharacters(in:.whitespaces) } } init(wrappedValue: String) { self.wrappedValue = wrappedValue.trimmingCharacters(in:.whitespaces) } } @propertyWrapper struct NonEmpty { var wrappedValue: String { didSet { if wrappedValue.isEmpty { wrappedValue = "(empty)" } } } init(wrappedValue: String) { self.wrappedValue = wrappedValue.isEmpty ? "(empty)" : wrappedValue } } struct Form { @NonEmpty @Trimmed var username = " " } ```

ลำดับการเริ่มต้น

ตัวห่อหุ้มจะถูกเริ่มต้นจากชั้นนอกสุดไปยังชั้นในสุด ซึ่งหมายความว่า init ของตัวห่อหุ้มด้านนอกจะได้รับผลลัพธ์จากการแปลงของตัวห่อหุ้มด้านใน ไม่ใช่ค่าเดิม

ข้อจำกัดของการซ้อนตัวห่อหุ้ม

• ตัวห่อหุ้มบางชนิดไม่สามารถประกอบเข้าด้วยกันได้อย่างราบรื่น — ตรวจสอบว่าชนิดของ `wrappedValue` ตรงกัน • คอมไพเลอร์ Swift อาจไม่อนุญาตให้ใช้ตัวห่อหุ้มหลายตัวเสมอไป โดยขึ้นอยู่กับความเข้ากันได้ของชนิดค่าที่ห่อหุ้ม • การเข้าถึง `projectedValue` ผ่าน `$x` จะเข้าถึง projection ของตัวห่อหุ้มชั้นนอกสุดได้เท่านั้น

ตัวอย่าง SwiftUI: @EnvironmentObject + การสังเกตการเปลี่ยนแปลง

SwiftUI ไม่อนุญาตให้ซ้อน `@EnvironmentObject` และ `@Published` ในพร็อพเพอร์ตีเดียวกัน แต่คุณสามารถสังเกตโมเดล `@EnvironmentObject` ที่ใช้ `@Published` ภายในได้

การดีบักตัวห่อหุ้มที่ซ้อนกัน

ใช้ `_propertyName` เพื่อเข้าถึงอินสแตนซ์ของตัวห่อหุ้มโดยตรง: ```swift print(form._username) // A> — the outer wrapper instance ```

ทางเลือก: ประกอบภายในตัวห่อหุ้มเดียว

บ่อยครั้ง การประกอบตรรกะไว้ในตัวห่อหุ้มเพียงตัวเดียวจะเป็นระเบียบกว่า: ```swift @propertyWrapper struct CleanUsername { var wrappedValue: String { didSet { wrappedValue = clean(wrappedValue) } } func clean(_ s: String) -> String { let t = s.trimmingCharacters(in:.whitespaces) return t.isEmpty ? "(empty)" : t } } ```

รูปแบบการซ้อนที่ใช้ได้จริง

รูปแบบการซ้อนที่ใช้ได้ทั่วไป: • `@UserDefault` + `@Published` (การคงอยู่ของข้อมูล + การสังเกตการเปลี่ยนแปลง) • `@NonNegative` + `@Clamped` (ชั้นการตรวจสอบความถูกต้อง) • แบบเฉพาะเฟรมเวิร์ก: `@Environment` + `@Binding` ในมุมมอง SwiftUI

ตรวจสอบความเข้าใจอย่างรวดเร็ว

เมื่อซ้อนตัวห่อหุ้มพร็อพเพอร์ตีสองตัว ตัวใดจะถูกเริ่มต้นก่อน

สรุป

ประเด็นสำคัญ: • `@A @B var x` จะถูกคลี่รูปแบบโดยนัยเป็น `A>` • ตัวห่อหุ้มด้านนอกจะเริ่มต้นโดยใช้ wrappedValue ของตัวห่อหุ้มด้านในเป็นอินพุต • `$x` จะเข้าถึง projectedValue ของตัวห่อหุ้มชั้นนอกสุดเท่านั้น • `_x` จะเข้าถึงอินสแตนซ์ของตัวห่อหุ้มโดยตรง • เมื่อทำได้ ควรเลือกตัวห่อหุ้มเดียวที่ประกอบตรรกะไว้ภายใน แทนการซ้อนหลายชั้น เรียนจบแล้ว! ต่อไป: ชนิด Result

คำถามที่พบบ่อย

บทเรียน “การประกอบพร็อพเพอร์ตีแรปเปอร์หลายรายการ” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การประกอบพร็อพเพอร์ตีแรปเปอร์หลายรายการ” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Swift Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Swift Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การประกอบพร็อพเพอร์ตีแรปเปอร์หลายรายการ”

ซ้อนพร็อพเพอร์ตีแรปเปอร์และทำความเข้าใจลำดับการเริ่มต้น คุณปฏิบัติ Swift Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Swift Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Swift Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “การประกอบพร็อพเพอร์ตีแรปเปอร์หลายรายการ” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Swift Academy นี้ได้ไหม

ได้ บทเรียน Swift Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. สร้างพร็อพเพอร์ตีแรปเปอร์แบบกำหนดเอง
  2. ค่าที่ฉายด้วย $binding
  3. @Published และการสังเกตการณ์ใน Combine
  4. การประกอบพร็อพเพอร์ตีแรปเปอร์หลายรายการ
← กลับไปที่ Swift Academy