Swift Academy · บทเรียน

การเปลี่ยนแปลงค่าและการกำหนด self ใหม่

แทนที่ self ทั้งหมดจากเมธอดแบบ mutating

บทเรียน 3 จาก 413 ขั้นตอน

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

การกำหนดค่าให้ self ใหม่

ภายในเมธอด mutating คุณสามารถกำหนดค่าใหม่ทั้งก้อนให้กับ self เพื่อแทนที่อินสแตนซ์ทั้งหมดได้

struct Point {
    var x = 0
    var y = 0
    mutating func reset() {
        self = Point(x: 0, y: 0)
    }
}
var p = Point(x: 3, y: 4)
p.reset()
print(p.x, p.y)

เหตุผลที่กำหนดค่าให้ self ใหม่

การกำหนดค่าให้ self ใหม่มีประโยชน์เมื่อการแสดงสถานะใหม่เป็นอินสแตนซ์ที่สร้างขึ้นใหม่ทำได้ง่ายกว่าการแก้ไขฟิลด์ทีละรายการ

struct Vector {
    var dx: Int
    var dy: Int
    mutating func negate() {
        self = Vector(dx: -dx, dy: -dy)
    }
}
var v = Vector(dx: 2, dy: -3)
v.negate()
print(v.dx, v.dy)

ชนิดแจกแจงกำหนดค่าให้ self ใหม่

สำหรับชนิดแจกแจง การเปลี่ยนกรณีทำได้โดยกำหนดกรณีใหม่ให้กับ self

enum State {
    case idle, running, done
    mutating func advance() {
        switch self {
        case .idle: self = .running
        case .running: self = .done
        case .done: self = .done
        }
    }
}
var s = State.idle
s.advance()
s.advance()
print(s)

เทียบเท่ากับการแก้ไขฟิลด์

การกำหนด self = Point(x: 1, y: 1) เทียบเท่ากับการกำหนดค่าให้ x และ y แยกกัน เพียงแต่กระชับกว่า

struct Point {
    var x = 0
    var y = 0
    mutating func setBoth(_ n: Int) {
        self = Point(x: n, y: n)
    }
}
var p = Point()
p.setBoth(7)
print(p.x, p.y)

อ่านค่า self เดิมก่อน

คุณสามารถคำนวณอินสแตนซ์ใหม่จากอินสแตนซ์ปัจจุบันก่อนกำหนดค่าใหม่ได้

struct Counter {
    var value: Int
    mutating func doubled() {
        self = Counter(value: value * 2)
    }
}
var c = Counter(value: 5)
c.doubled()
print(c.value)

การแปลงรูปแบบตัวสร้าง

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

struct Temperature {
    var celsius: Double
    mutating func toRounded() {
        self = Temperature(celsius: celsius.rounded())
    }
}
var t = Temperature(celsius: 21.7)
t.toRounded()
print(t.celsius)

ใช้ได้เฉพาะในเมธอด mutating

คุณกำหนดค่าให้ self ได้เฉพาะภายในเมธอดที่ระบุ mutating เท่านั้น เมธอดทั่วไปทำเช่นนั้นไม่ได้

struct Flag {
    var on = false
    mutating func turnOn() {
        self = Flag(on: true)
    }
}
var f = Flag()
f.turnOn()
print(f.on)

การใช้ร่วมกับตรรกะ

คุณสามารถแยกแขนงและกำหนดค่าให้ self ใหม่ได้เฉพาะในบางกรณี

struct Score {
    var points: Int
    mutating func clamp() {
        if points > 100 {
            self = Score(points: 100)
        }
    }
}
var s = Score(points: 150)
s.clamp()
print(s.points)

รูปแบบการสลับค่าของชนิดแจกแจง

การสลับค่าของชนิดแจกแจงที่มีสองกรณีเป็นตัวอย่างคลาสสิกของการกำหนดค่าให้ self ใหม่

enum Switch {
    case off, on
    mutating func flip() {
        self = (self == .off) ? .on : .off
    }
}
var sw = Switch.off
sw.flip()
print(sw)

สำเนาอื่นไม่มีผลกระทบ

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

struct Box { var n: Int; mutating func zero() { self = Box(n: 0) } }
var a = Box(n: 5)
var b = a
a.zero()
print(a.n, b.n)

เจตนาที่อ่านเข้าใจได้

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

struct Pair {
    var a: Int
    var b: Int
    mutating func swapValues() {
        self = Pair(a: b, b: a)
    }
}
var p = Pair(a: 1, b: 2)
p.swapValues()
print(p.a, p.b)

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

ทดสอบการกำหนดค่าให้ self ใหม่

สรุป

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

enum T { case a, b; mutating func go() { self = .b } }
var t = T.a
t.go()
print(t)
เริ่มต้นได้ฟรี

เรียนรู้ Swift ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
122
บทเรียน
409

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

บทเรียน “การเปลี่ยนแปลงค่าและการกำหนด self ใหม่” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “การเปลี่ยนแปลงค่าและการกำหนด self ใหม่”

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

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

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

บทเรียน “การเปลี่ยนแปลงค่าและการกำหนด self ใหม่” ใช้เวลานานแค่ไหน

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

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

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

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

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