สถานะ แอ็กชัน และรีดิวเซอร์
จำลองความสามารถเป็นรีดิวเซอร์บริสุทธิ์ที่ทำงานกับสถานะ
สถานะ แอ็กชัน และรีดิวเซอร์ เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- สถานะ แอ็กชัน และรีดิวเซอร์
- Store และการผสานกับ SwiftUI
- เอฟเฟกต์และการพึ่งพา
- การประกอบและทดสอบความสามารถ