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

คีย์เวิร์ด mutating

เขียนเมธอดที่แก้ไขสถานะของ struct และ enum

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

เมธอดไม่สามารถเปลี่ยนแปลงค่าได้เป็นค่า default

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

struct Counter {
    var value = 0
    mutating func increment() {
        value += 1
    }
}
var c = Counter()
c.increment()
print(c.value)

เหตุใดจึงต้องเปลี่ยนแปลงค่า

เนื่องจากโครงสร้างเป็นชนิดข้อมูลแบบค่า คอมไพเลอร์จึงกำหนดให้คุณต้องประกาศยอมให้เปลี่ยนแปลงค่า เพื่อให้การเปลี่ยนแปลงนั้นชัดเจน

struct Bank {
    var balance = 0
    mutating func deposit(_ amount: Int) {
        balance += amount
    }
}
var b = Bank()
b.deposit(50)
print(b.balance)

เมธอดที่ไม่เปลี่ยนแปลงค่า

เมธอดที่อ่านเฉพาะคุณสมบัติไม่จำเป็นต้องใช้ mutating

struct Rectangle {
    var width = 0
    var height = 0
    func area() -> Int {
        return width * height
    }
}
let r = Rectangle(width: 3, height: 4)
print(r.area())

การเปลี่ยนแปลงค่าในชนิดแจกแจง

ชนิดแจกแจงก็มีเมธอด mutating ได้เช่นกัน โดยเมธอดเหล่านี้จะเปลี่ยนอินสแตนซ์ไปเป็นกรณีอื่น

enum Light {
    case on, off
    mutating func toggle() {
        self = (self == .on) ? .off : .on
    }
}
var l = Light.off
l.toggle()
print(l)

เรียกใช้กับ let ไม่ได้

คุณไม่สามารถเรียกใช้เมธอด mutating กับอินสแตนซ์ค่าคงที่ (let) ได้ เพราะจะทำให้เกิดข้อผิดพลาดขณะคอมไพล์

struct Counter {
    var value = 0
    mutating func bump() { value += 1 }
}
var c = Counter()
c.bump()
// let d = Counter(); d.bump() // error
print(c.value)

การเปลี่ยนแปลงหลายคุณสมบัติ

เมธอด mutating เมธอดเดียวสามารถเปลี่ยนคุณสมบัติหลายรายการได้พร้อมกัน

struct Player {
    var x = 0
    var y = 0
    mutating func move(dx: Int, dy: Int) {
        x += dx
        y += dy
    }
}
var p = Player()
p.move(dx: 3, dy: 5)
print(p.x, p.y)

การเปลี่ยนแปลงค่าพร้อมคืนค่า

เมธอด mutating สามารถคืนค่าไปพร้อมกับการเปลี่ยนสถานะได้

struct Stack {
    var items: [Int] = []
    mutating func pop() -> Int? {
        return items.popLast()
    }
}
var s = Stack(items: [1, 2, 3])
print(s.pop() ?? -1)
print(s.items)

การใช้ mutating ในไลบรารีมาตรฐาน

เมธอดอย่าง append ของ Array เป็นเมธอด mutating จึงต้องประกาศอาร์เรย์เป็น var จึงจะเรียกใช้เมธอดเหล่านี้ได้

var nums = [1, 2]
nums.append(3)
print(nums)

การเปลี่ยนแปลงค่ากับสถานะที่คำนวณ

คุณสามารถอัปเดตสถานะที่ได้มาจากการคำนวณภายในเมธอดที่เปลี่ยนแปลงค่าได้ เพื่อรักษาเงื่อนไขคงที่ให้สอดคล้องกัน

struct Wallet {
    var coins = 0
    var label = "empty"
    mutating func add(_ n: Int) {
        coins += n
        label = coins > 0 ? "has coins" : "empty"
    }
}
var w = Wallet()
w.add(5)
print(w.coins, w.label)

ลำดับมีความสำคัญ

คำสั่งภายในเมธอดที่เปลี่ยนแปลงค่าจะทำงานจากบนลงล่าง ดังนั้นบรรทัดถัดไปจึงมองเห็นการเปลี่ยนแปลงจากบรรทัดก่อนหน้า

struct Accumulator {
    var total = 0
    mutating func process() {
        total += 1
        total *= 10
    }
}
var a = Accumulator()
a.process()
print(a.total)

คลาสไม่จำเป็นต้องใช้ mutating

ชนิดข้อมูลแบบอ้างอิง (class) สามารถเปลี่ยนคุณสมบัติได้โดยไม่ต้องใช้คำสำคัญนี้ เพราะไม่ใช่ชนิดข้อมูลแบบค่า

class Box {
    var value = 0
    func bump() { value += 1 }
}
let box = Box()
box.bump()
print(box.value)

ตรวจสอบความเข้าใจ

ทดสอบคำสำคัญ mutating

สรุป

ให้ใส่ mutating ให้กับเมธอดของอินสแตนซ์ที่เป็นโครงสร้างหรือชนิดแจกแจง เมื่อเมธอดนั้นเปลี่ยนคุณสมบัติที่จัดเก็บไว้ (หรือเปลี่ยนกรณีสำหรับชนิดแจกแจง) เมธอดดังกล่าวเรียกใช้กับอินสแตนซ์ let ไม่ได้ ส่วนคลาสซึ่งเป็นชนิดข้อมูลแบบอ้างอิงไม่จำเป็นต้องใช้คำสำคัญนี้

struct C { var v = 0; mutating func inc() { v += 1 } }
var c = C()
c.inc()
print(c.v)

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

บทเรียน “คีย์เวิร์ด mutating” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “คีย์เวิร์ด mutating”

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

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

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

บทเรียน “คีย์เวิร์ด mutating” ใช้เวลานานแค่ไหน

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

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

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

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

  1. ชนิดค่าและการเปลี่ยนแปลงไม่ได้
  2. คีย์เวิร์ด mutating
  3. การเปลี่ยนแปลงค่าและการกำหนด self ใหม่
  4. ทางเลือกที่ไม่เปลี่ยนแปลงค่า
← กลับไปที่ Swift Academy