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

reduce และ reduce(into:)

รวมคอลเลกชันให้เป็นค่าเดียว

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

reduce คืออะไร

reduce รวมลำดับทั้งหมดให้เหลือค่าเดียว โดยรวมตัวสะสมเข้ากับสมาชิกแต่ละตัวซ้ำ ๆ

  • คุณต้องกำหนดค่าเริ่มต้น
  • และคลอเชอร์ (accumulator, element) -> accumulator

การหาผลรวมด้วย reduce

ตัวอย่างคลาสสิกคือการบวกค่าทั้งหมดเข้าด้วยกัน:

let nums = [1, 2, 3, 4]
let total = nums.reduce(0) { acc, x in acc + x }
print(total)  // 10

รูปแบบย่อของตัวดำเนินการ

เมื่อคลอเชอร์มีเพียงตัวดำเนินการตัวเดียว คุณสามารถส่งฟังก์ชันของตัวดำเนินการนั้นได้โดยตรง:

let nums = [1, 2, 3, 4]
print(nums.reduce(0, +))   // 10
print(nums.reduce(1, *))   // 24

การลดรูปเป็นชนิดอื่น

ชนิดของผลลัพธ์อาจแตกต่างจากชนิดของสมาชิกได้:

let words = ["a", "b", "c"]
let joined = words.reduce("") { $0 + $1.uppercased() }
print(joined)  // "ABC"

การหาค่าสูงสุดด้วย reduce

คุณสามารถคำนวณค่ารวมอื่น ๆ นอกเหนือจากผลรวมได้:

let nums = [3, 9, 2, 7]
let maxVal = nums.reduce(Int.min) { max($0, $1) }
print(maxVal)  // 9

ต้นทุนของ reduce

reduce แบบปกติจะสร้างตัวสะสมใหม่ทั้งหมดในแต่ละขั้นตอน สำหรับชนิดค่าอย่าง String หรือ Array นั่นหมายถึงการคัดลอกตัวสะสมทั้งหมดสำหรับสมาชิกทุกตัว — ทำให้เกิดงานระดับ O(n²) เมื่อข้อมูลเข้ามีขนาดใหญ่

เข้าสู่ reduce(into:)

reduce(into:) ส่งตัวสะสมเป็นพารามิเตอร์ inout จึงสามารถเปลี่ยนค่าเดิมได้โดยตรงแทนการคัดลอก:

let nums = [1, 2, 2, 3, 3, 3]
let counts = nums.reduce(into: [Int: Int]()) { dict, n in
    dict[n, default: 0] += 1
}
print(counts)  // [1: 1, 2: 2, 3: 3]

การสร้างอาร์เรย์อย่างมีประสิทธิภาพ

reduce(into:) โดดเด่นเมื่อใช้สะสมข้อมูลลงในคอลเลกชัน:

let nums = [1, 2, 3, 4, 5]
let evensSquared = nums.reduce(into: [Int]()) { result, n in
    if n % 2 == 0 { result.append(n * n) }
}
print(evensSquared)  // [4, 16]

reduce กับ reduce(into:)

ผลลัพธ์เหมือนกัน แต่ลักษณะด้านประสิทธิภาพแตกต่างกัน:

let parts = ["a", "b", "c"]
let a = parts.reduce("") { $0 + $1 }            // copies each step
let b = parts.reduce(into: "") { $0 += $1 }    // mutates in place
print(a, b)  // abc abc

การจัดกลุ่มด้วย reduce(into:)

รูปแบบที่พบบ่อยคือ การจัดรายการลงถังตามคีย์:

let names = ["Ann", "Al", "Bo", "Cy"]
let byInitial = names.reduce(into: [Character: [String]]()) { dict, name in
    dict[name.first!, default: []].append(name)
}
print(byInitial[Character("A")]!)  // ["Ann", "Al"]

การเลือกระหว่างสองแบบ

ใช้ reduce กับตัวสะสมสเกลาร์ที่มีต้นทุนต่ำ เช่น จำนวนเต็มหรือจำนวนจริง ใช้ reduce(into:) เมื่อตัวสะสมเป็นคอลเลกชันหรือชนิดค่าขนาดใหญ่ชนิดอื่น เพื่อหลีกเลี่ยงการคัดลอก

let nums = [1, 2, 3]
print(nums.reduce(0, +))                          // scalar: plain reduce
print(nums.reduce(into: Set<Int>()) { $0.insert($1) }) // collection: into

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

เหตุใดจึงควรเลือกใช้ reduce(into:) เมื่อสร้างพจนานุกรมหรืออาร์เรย์

สรุป

คุณได้เรียนรู้การลดรูปแล้ว:

  • reduce(initial) { acc, x in ... } รวมลำดับให้เหลือค่าเดียว
  • รูปแบบย่อของตัวดำเนินการ: reduce(0, +)
  • reduce(into:) เปลี่ยนแปลงตัวสะสมแบบ inout จึงเหมาะสำหรับคอลเลกชัน
  • เหมาะสำหรับการนับ การจัดกลุ่ม และการเชื่อมข้อมูล

ถัดไป: flatMap และการต่อการทำงาน

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

บทเรียน “reduce และ reduce(into:)” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “reduce และ reduce(into:)”

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

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

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

บทเรียน “reduce และ reduce(into:)” ใช้เวลานานแค่ไหน

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

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

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

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

  1. map และ compactMap
  2. filter และเพรดิเคต
  3. reduce และ reduce(into:)
  4. flatMap และการเชื่อมต่อ
← กลับไปที่ Swift Academy