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

สถานะ แอ็กชัน และรีดิวเซอร์

จำลองความสามารถเป็นรีดิวเซอร์บริสุทธิ์ที่ทำงานกับสถานะ

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

สถาปัตยกรรมแบบประกอบได้คืออะไร

สถาปัตยกรรมแบบประกอบได้ หรือ TCA เป็นไลบรารีสำหรับสร้างแอป Swift ที่มีโครงสร้างสม่ำเสมอและทดสอบได้ โดยมีองค์ประกอบหลักสามส่วน ได้แก่ State ซึ่งอธิบายข้อมูลของฟีเจอร์ Action ซึ่งอธิบายทุกเหตุการณ์ที่อาจเกิดขึ้น และ Reducer ซึ่งปรับเปลี่ยนสถานะเพื่อตอบสนองต่อการกระทำ

การไหลของข้อมูลทางเดียวนี้ทำให้ฟีเจอร์คาดเดาพฤติกรรมได้และทดสอบได้ง่าย

import ComposableArchitecture

// State holds data, Action describes events,
// a Reducer turns (state, action) into the next state.

มาโคร @Reducer

ฟีเจอร์หนึ่งถูกกำหนดเป็นชนิดข้อมูลที่กำกับด้วยมาโคร @Reducer มาโครจะสร้างโค้ดสนับสนุนและทำให้คุณประกาศ State Action และรีดิวเซอร์ body ไว้ด้วยกันในหน่วยเดียวที่เป็นอันหนึ่งอันเดียวกัน

ตามธรรมเนียม ชนิดข้อมูลจะตั้งชื่อตามฟีเจอร์ เช่น CounterFeature

import ComposableArchitecture

@Reducer
struct CounterFeature {
    // State, Action, and body go here
}

การกำหนด State

State มักเป็นโครงสร้างที่เก็บข้อมูลทั้งหมดที่ฟีเจอร์ต้องใช้ การกำกับด้วย @ObservableState ทำให้ SwiftUI สังเกตการเปลี่ยนแปลงได้อย่างแม่นยำ และแสดงผลใหม่เฉพาะส่วนที่ได้รับผลกระทบ

เก็บสถานะให้มีเฉพาะสิ่งจำเป็น และคำนวณค่าที่ได้จากสถานะแทนการจัดเก็บไว้ เพื่อให้มีแหล่งข้อมูลจริงเพียงแหล่งเดียว

import ComposableArchitecture

@Reducer
struct CounterFeature {
    @ObservableState
    struct State: Equatable {
        var count = 0
    }
}

การกำหนดการกระทำ

Action คือรายการแจงนับที่แสดงทุกเหตุการณ์ที่ฟีเจอร์จัดการได้ เช่น การแตะของผู้ใช้ การตอบกลับ การทำงานของตัวจับเวลา และอื่น ๆ แต่ละกรณีจะตั้งชื่อตามสิ่งที่เกิดขึ้น ไม่ใช่คำสั่งให้เปลี่ยนสถานะโดยตรง

ชื่อการกระทำที่ชัดเจนทำให้พฤติกรรมของฟีเจอร์อธิบายตัวเองได้

import ComposableArchitecture

@Reducer
struct CounterFeature {
    @ObservableState
    struct State: Equatable { var count = 0 }

    enum Action {
        case incrementTapped
        case decrementTapped
    }
}

body ของ Reducer

ตรรกะของรีดิวเซอร์อยู่ในพร็อพเพอร์ตีที่คำนวณค่า body ซึ่งส่งคืนค่าเป็น ReducerOf<Self> ภายใน คุณใช้ Reduce พร้อมโคลเชอร์ที่รับ state ซึ่งเปลี่ยนแปลงได้ และ action ที่เข้ามา

คุณตรวจสอบการกระทำแต่ละกรณีและเปลี่ยนสถานะให้สอดคล้องกัน

import ComposableArchitecture

@Reducer
struct CounterFeature {
    @ObservableState
    struct State: Equatable { var count = 0 }
    enum Action { case incrementTapped, decrementTapped }

    var body: some ReducerOf<Self> {
        Reduce { state, action in
            switch action {
            case .incrementTapped:
                state.count += 1
                return .none
            case .decrementTapped:
                state.count -= 1
                return .none
            }
        }
    }
}

การส่งคืนเอฟเฟกต์

แต่ละแขนงของรีดิวเซอร์ต้องส่งคืนค่า Effect การส่งคืน .none หมายความว่าไม่มีงานแบบอะซิงโครนัสเพิ่มเติมที่ต้องทำหลังจากเปลี่ยนสถานะแล้ว

เมื่อจำเป็นต้องมีผลข้างเคียง เช่น การเรียกเครือข่าย คุณจะส่งคืนเอฟเฟกต์ที่ทำงานนั้น บทเรียนถัดไปคุณจะได้ศึกษาเอฟเฟกต์เพิ่มเติม

import ComposableArchitecture

// Every reducer branch returns an Effect.
// No side effect needed? Return .none.
// Need async work? Return an effect describing it.
Reduce { state, action in
    state.count += 1
    return .none
}

การเปลี่ยนสถานะถูกรวมไว้ที่ศูนย์กลาง

กฎสำคัญข้อหนึ่งของ TCA คือ มีเพียงรีดิวเซอร์เท่านั้นที่เปลี่ยนสถานะได้ และต้องเปลี่ยนเพื่อตอบสนองต่อการกระทำเท่านั้น มุมมองจะไม่เปลี่ยนสถานะโดยตรง แต่จะส่งการกระทำ

การมีจุดศูนย์กลางเพียงแห่งเดียวสำหรับการเปลี่ยนแปลง ทำให้ติดตามการไหลของข้อมูลและทดสอบได้ง่าย

import ComposableArchitecture

// Views send actions; the reducer mutates state.
// store.send(.incrementTapped)  ->  state.count += 1
// No direct state mutation outside the reducer.

การจำลองข้อมูลที่ผู้ใช้ป้อนใน State

ฟีเจอร์ลักษณะแบบฟอร์มจะเก็บช่องข้อมูลที่แก้ไขได้ไว้ใน State และเพิ่มการกระทำสำหรับการเปลี่ยนแปลง การกำกับพร็อพเพอร์ตีด้วยการผูกข้อมูลทำให้ตัวควบคุมของ SwiftUI อัปเดตค่าเหล่านั้นผ่านการกระทำได้อย่างปลอดภัยตามชนิดข้อมูล

ในที่นี้ ฟีเจอร์จะติดตามช่องข้อความและสวิตช์สลับ

import ComposableArchitecture

@Reducer
struct FormFeature {
    @ObservableState
    struct State: Equatable {
        var name = ""
        var isSubscribed = false
    }
    enum Action: BindableAction {
        case binding(BindingAction<State>)
    }
    var body: some ReducerOf<Self> {
        BindingReducer()
    }
}

การกระทำพร้อมค่าที่เชื่อมโยง

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

ในที่นี้ การกระทำตอบกลับจะส่งจำนวนที่ดึงมาไปด้วย

import ComposableArchitecture

@Reducer
struct NumberFeature {
    @ObservableState
    struct State: Equatable { var value = 0 }
    enum Action {
        case reloadTapped
        case responseReceived(Int)
    }
    var body: some ReducerOf<Self> {
        Reduce { state, action in
            switch action {
            case .reloadTapped:
                return .none
            case let .responseReceived(value):
                state.value = value
                return .none
            }
        }
    }
}

เหตุใดสถานะที่เทียบเท่าได้จึงมีประโยชน์

การทำให้ State สอดคล้องกับ Equatable ทำให้ TCA ตรวจพบว่าสถานะเปลี่ยนแปลงจริงหรือไม่ ซึ่งช่วยให้มุมมองอัปเดตได้อย่างแม่นยำและทดสอบได้อย่างครบถ้วน นี่เป็นข้อกำหนดเล็กน้อยที่ให้ประโยชน์มาก

ชนิดข้อมูลสถานะส่วนใหญ่รองรับ Equatable ได้โดยไม่ต้องเขียนโค้ดเพิ่มเติม เพราะพร็อพเพอร์ตีที่จัดเก็บไว้นั้นรองรับอยู่แล้ว

import ComposableArchitecture

@ObservableState
struct State: Equatable {
    var count = 0
    var title = ""
}
// Equatable enables change detection and test assertions.

โครงสร้างของฟีเจอร์ที่สมบูรณ์

ฟีเจอร์ที่เสร็จสมบูรณ์จะอ่านจากบนลงล่าง ได้แก่ มาโคร สถานะที่สังเกตได้ การแจงนับการกระทำ และ body ของรีดิวเซอร์ ทุกอย่างเกี่ยวกับฟีเจอร์อยู่ในชนิดข้อมูลเดียว จึงทำให้ฟีเจอร์ของ TCA นำมาประกอบกันและตรวจทานได้

โครงสร้างที่สม่ำเสมอนี้จะปรากฏซ้ำในทุกฟีเจอร์ของแอป

import ComposableArchitecture

@Reducer
struct CounterFeature {
    @ObservableState
    struct State: Equatable { var count = 0 }
    enum Action { case incrementTapped, decrementTapped }
    var body: some ReducerOf<Self> {
        Reduce { state, action in
            switch action {
            case .incrementTapped: state.count += 1; return .none
            case .decrementTapped: state.count -= 1; return .none
            }
        }
    }
}

ตรวจสอบความเข้าใจ: สามองค์ประกอบ

ทบทวนบทบาทของ State, Action และ Reducer ใน TCA

ทบทวน: State, Action และ Reducer

คุณได้เรียนรู้หัวใจของฟีเจอร์ TCA:

  • @Reducer กำหนดชนิดข้อมูลฟีเจอร์ที่รวมทุกอย่างไว้ในที่เดียว
  • @ObservableState บนโครงสร้างจะเก็บข้อมูลของฟีเจอร์และเปิดใช้การสังเกตที่แม่นยำ
  • การแจงนับ Action จะแสดงทุกเหตุการณ์ และอาจมีค่าที่เชื่อมโยงอยู่ด้วย
  • body ของรีดิวเซอร์ใช้ Reduce เพื่อเปลี่ยนสถานะและส่งคืนค่า Effect โดยใช้ .none เมื่อไม่ต้องการผลข้างเคียง
  • มีเพียงรีดิวเซอร์ที่เปลี่ยนสถานะได้ จึงทำให้การไหลของข้อมูลคาดเดาได้

ถัดไป คุณจะเชื่อมต่อฟีเจอร์นี้กับ SwiftUI ด้วย Store

import ComposableArchitecture

// Recap: @Reducer + State + Action + body(Reduce)
// One type, one source of truth, predictable updates.

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

บทเรียน “สถานะ แอ็กชัน และรีดิวเซอร์” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “สถานะ แอ็กชัน และรีดิวเซอร์”

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

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

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

บทเรียน “สถานะ แอ็กชัน และรีดิวเซอร์” ใช้เวลานานแค่ไหน

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

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

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

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

  1. สถานะ แอ็กชัน และรีดิวเซอร์
  2. Store และการผสานกับ SwiftUI
  3. เอฟเฟกต์และการพึ่งพา
  4. การประกอบและทดสอบความสามารถ
← กลับไปที่ Swift Academy