Swift Academy · บทเรียน

@Published และการสังเกตการณ์ใน Combine

ทำความเข้าใจการทำงานภายในของ @Published ในการส่งการเปลี่ยนแปลงผ่านผู้เผยแพร่ของ Combine

บทเรียน 3 จาก 412 ขั้นตอน

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

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

`@Published` เป็นตัวห่อหุ้มพร็อพเพอร์ตีจากเฟรมเวิร์ก Combine ซึ่งจะส่งค่าใหม่ผ่านตัวเผยแพร่ทุกครั้งที่พร็อพเพอร์ตีเปลี่ยนแปลง

พื้นฐานของ @Published

```swift import Combine class Counter: ObservableObject { @Published var count = 0 } let c = Counter() let cancel = c.$count.sink { print("Count: \($0)") } c.count += 1 // "Count: 1" c.count += 1 // "Count: 2" ```

โพรโทคอล ObservableObject

```swift class ViewModel: ObservableObject { @Published var title = "Initial" @Published var items: [String] = [] } ``` คลาสใดก็ตามที่สอดคล้องกับ `ObservableObject` จะได้รับตัวเผยแพร่ `objectWillChange` โดยอัตโนมัติ

ตัวเผยแพร่ objectWillChange

```swift class VM: ObservableObject { @Published var name = "" } let vm = VM() let cancel = vm.objectWillChange.sink { print("Will change") } vm.name = "Alice" // "Will change" printed before assignment ```

@Published ร่วมกับ SwiftUI @StateObject

```swift @StateObject var vm = ViewModel() // In View body: Text(vm.title) // Re-renders when vm.title changes ``` `@StateObject` เป็นเจ้าของ ViewModel ส่วน `@ObservedObject` จะสังเกตออบเจ็กต์ที่มีเจ้าของอยู่ภายนอก

การเชื่อมตัวเผยแพร่จาก @Published

```swift class Search: ObservableObject { @Published var query = "" @Published var results: [String] = [] private var cancellables = Set() init() { $query .debounce(for: 0.3, scheduler: RunLoop.main) .sink { [weak self] q in self?.search(q) } .store(in: &cancellables) } } ```

@Published ส่งค่าก่อนการกำหนดค่า

`objectWillChange` จะทำงาน *ก่อน* จะจัดเก็บค่าใหม่: ```swift vm.objectWillChange.sink { _ in print("will change") } $count.sink { n in print("is \(n)") } // Order: "will change" then "is 1" ```

การจัดเก็บการสมัครรับข้อมูล

```swift var cancellables = Set() c.$count .sink { print("\($0)") } .store(in: &cancellables) // cancellables keeps subscription alive ```

ข้อจำกัดของ @Published

• ใช้ได้เฉพาะกับคลาส (ชนิดอ้างอิง) • ใช้กับค่าคงที่ `let` ไม่ได้ • ไม่ทำงานข้ามขอบเขตของแอกเตอร์หากไม่มีการแยกแบบระบุชัดเจน • ค่าจะถูกส่งออกไป *ก่อน* การกำหนดค่าจะเสร็จสมบูรณ์ (ความหมายแบบ willSet)

แมโครสำหรับการสังเกตการณ์ (Swift 5.9+)

Swift 5.9 เพิ่ม `@Observable` ซึ่งเป็นทางเลือกที่เรียบง่ายกว่า: ```swift @Observable class Counter { var count = 0 } // No Combine import needed; SwiftUI auto-subscribes ```

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

`@Published` ส่งค่าออกมาเมื่อใด ก่อนหรือหลังจากกำหนดค่าให้พร็อพเพอร์ตี

ทบทวน

ประเด็นสำคัญ: • `@Published var x` เปิดเผย `$x` เป็น `Publisher` • `ObservableObject` จะได้รับตัวเผยแพร่ `objectWillChange` โดยอัตโนมัติ • ทำงานก่อนจัดเก็บค่าใหม่ (willSet) • จัดเก็บการสมัครรับข้อมูลไว้ใน `Set` • Swift 5.9: `@Observable` เข้ามาแทนที่ความต้องการใช้ `@Published` ส่วนใหญ่ ถัดไป: การประกอบตัวห่อหุ้มพร็อพเพอร์ตี
เริ่มต้นได้ฟรี

เรียนรู้ Swift ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
122
บทเรียน
409

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

บทเรียน “@Published และการสังเกตการณ์ใน Combine” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “@Published และการสังเกตการณ์ใน Combine”

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

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

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

บทเรียน “@Published และการสังเกตการณ์ใน Combine” ใช้เวลานานแค่ไหน

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

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

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

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

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