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

เมธอดที่เปลี่ยนแปลงค่าและความหมายเชิงอรรถศาสตร์แบบคัดลอกเมื่อเขียน

ทำความเข้าใจว่าเหตุใดจึงต้องใช้ mutating และการเพิ่มประสิทธิภาพ COW ของ Swift ทำงานอย่างไร

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

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

เมธอดของโครงสร้างที่แก้ไขคุณสมบัติที่จัดเก็บไว้ต้องระบุ `mutating` นอกจากนี้ Swift ยังใช้การคัดลอกเมื่อเขียน (COW) เพื่อทำให้ความหมายเชิงค่ามีประสิทธิภาพ

คีย์เวิร์ดสำหรับการแก้ไขค่า

```swift struct Counter { var count = 0 mutating func increment() { count += 1 } mutating func reset() { count = 0 } } var c = Counter() c.increment() // count = 1 ``` หากไม่มี `mutating` คอมไพเลอร์จะปฏิเสธเมธอดที่เปลี่ยนแปลง `self`

เหตุผลที่ต้องใช้ mutating

โครงสร้างเป็นชนิดค่า เมื่อส่งโครงสร้างเข้าไป คุณกำลังส่ง *สำเนา* คอมไพเลอร์จึงต้องใช้ `mutating` เพื่อทราบว่าเมธอดจะเปลี่ยนแปลงค่าต้นฉบับ: ```swift let c = Counter() c.increment() // ❌ cannot use mutating on let ```

การกำหนดค่าตัวเองใหม่ในเมธอดที่เปลี่ยนแปลงค่า

เมธอด `mutating` สามารถแทนที่ `self` ทั้งหมดได้: ```swift struct Toggle { var isOn: Bool mutating func flip() { self = Toggle(isOn: !isOn) } } ```

ความหมายเชิงค่า: พฤติกรรมการคัดลอก

```swift var a = Counter() var b = a // b is an independent copy a.increment() print(a.count) // 1 print(b.count) // 0 — unaffected ``` การกำหนดโครงสร้างให้ตัวแปรจะคัดลอกคุณสมบัติที่จัดเก็บไว้ทั้งหมด

การคัดลอกเมื่อเขียน (COW)

คอลเลกชันที่มีมาให้ใน Swift ได้แก่ อาร์เรย์ พจนานุกรม เซต และสตริง ใช้ COW: ```swift var a = [1,2,3] var b = a // no copy yet — shared storage b.append(4) // NOW a copy is made — a is unchanged print(a) // [1,2,3] print(b) // [1,2,3,4] ```

เหตุผลที่ COW สำคัญ

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

การทำ COW แบบกำหนดเอง

```swift struct Buffer { private var storage: NSMutableData private mutating func ensureUnique() { if !isKnownUniquelyReferenced(&storage) { storage = storage.mutableCopy() as! NSMutableData } } mutating func append(_ byte: UInt8) { ensureUnique() // safe to mutate storage now } } ```

mutating และโปรโตคอล

เมธอดของโปรโตคอลที่เปลี่ยนแปลงค่าต้องระบุ `mutating` ในโปรโตคอล: ```swift protocol Resettable { mutating func reset() } struct Counter: Resettable { var count = 0 mutating func reset() { count = 0 } } ``` คลาสที่นำโปรโตคอลไปใช้ไม่จำเป็นต้องใช้ `mutating` (คลาสเป็นชนิดอ้างอิง)

โครงสร้างที่เก็บด้วยค่าคงที่ไม่เปลี่ยนแปลงได้โดยสมบูรณ์

```swift let pt = Point(x: 1, y: 2) pt.x = 3 // ❌ even though x is var inside Point ``` เมื่อโครงสร้างถูกเก็บไว้ใน `let` คุณสมบัติที่จัดเก็บไว้ทั้งหมดของโครงสร้างนั้นจะไม่สามารถเปลี่ยนแปลงได้

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

การคัดลอกเมื่อเขียนของ Swift จะทำการคัดลอกจริงเมื่อใด

สรุป

ประเด็นสำคัญ: • `mutating` ใช้ระบุเมธอดที่เปลี่ยนแปลงคุณสมบัติของโครงสร้าง • ไม่สามารถเรียกเมธอด `mutating` บนโครงสร้างที่เก็บด้วย `let` ได้ • การกำหนดค่าจะคัดลอกโครงสร้าง และ COW ทำให้การคัดลอกคอลเลกชันมีต้นทุนต่ำ • COW จะทำการคัดลอกจริงเมื่อมีการเปลี่ยนแปลงครั้งแรกเท่านั้น • ทำ COW แบบกำหนดเองได้ด้วย `isKnownUniquelyReferenced` จบหลักสูตรแล้ว! ถัดไป: การสืบทอดของคลาส

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

บทเรียน “เมธอดที่เปลี่ยนแปลงค่าและความหมายเชิงอรรถศาสตร์แบบคัดลอกเมื่อเขียน” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “เมธอดที่เปลี่ยนแปลงค่าและความหมายเชิงอรรถศาสตร์แบบคัดลอกเมื่อเขียน”

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

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

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

บทเรียน “เมธอดที่เปลี่ยนแปลงค่าและความหมายเชิงอรรถศาสตร์แบบคัดลอกเมื่อเขียน” ใช้เวลานานแค่ไหน

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

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

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

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

  1. ตัวเริ่มต้นแบบสมาชิกและตัวเริ่มต้นแบบกำหนดเอง
  2. คุณสมบัติที่จัดเก็บและตัวสังเกตคุณสมบัติ
  3. คุณสมบัติที่คำนวณในโครงสร้าง
  4. เมธอดที่เปลี่ยนแปลงค่าและความหมายเชิงอรรถศาสตร์แบบคัดลอกเมื่อเขียน
← กลับไปที่ Swift Academy