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

ทางเลือกที่ไม่เปลี่ยนแปลงค่า

ส่งคืนค่าใหม่แทนการแก้ไขค่าเดิมโดยตรง

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

คืนค่าแทนการเปลี่ยนแปลง

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

struct Counter {
    var value: Int
    func incremented() -> Counter {
        return Counter(value: value + 1)
    }
}
let c = Counter(value: 0)
let next = c.incremented()
print(c.value, next.value)

ค่าเดิมยังคงไม่เปลี่ยนแปลง

เนื่องจากไม่มีการเปลี่ยนแปลงค่า ค่าดั้งเดิมจึงยังคงอยู่และมีการสร้างค่าใหม่ขึ้นมา

struct Vector {
    var x: Int
    var y: Int
    func scaled(by factor: Int) -> Vector {
        return Vector(x: x * factor, y: y * factor)
    }
}
let v = Vector(x: 2, y: 3)
let big = v.scaled(by: 10)
print(v.x, v.y, big.x, big.y)

ใช้กับอินสแตนซ์ let ได้

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

struct Money {
    var cents: Int
    func plus(_ other: Int) -> Money {
        return Money(cents: cents + other)
    }
}
let m = Money(cents: 100)
print(m.plus(50).cents)

หลักการตั้งชื่อ

หลักการของ Swift คือ เมธอดที่เปลี่ยนแปลงค่าใช้คำกริยาเชิงคำสั่ง (sort) ส่วนเมธอดที่ไม่เปลี่ยนแปลงค่าใช้รูปอดีตกาลหรือรูปลงท้ายด้วย -ed/-ing (sorted)

var nums = [3, 1, 2]
let ordered = nums.sorted()
nums.sort()
print(ordered, nums)

sorted กับ sort

ไลบรารีมาตรฐานใช้หลักการนี้ โดย sorted() คืนอาร์เรย์ใหม่ ส่วน sort() เปลี่ยนแปลงอาร์เรย์เดิมโดยตรง

let a = [5, 2, 8, 1]
let b = a.sorted()
print(a)
print(b)

reversed กับ reverse

เช่นเดียวกัน reversed() ไม่เปลี่ยนแปลงค่าดั้งเดิม ในที่นี้เราสร้างผลลัพธ์ให้เป็นค่าจริงด้วย Array

let a = [1, 2, 3]
let b = Array(a.reversed())
print(a, b)

การต่อเรียกใช้เมธอดที่ไม่เปลี่ยนแปลงค่า

เมธอดที่ไม่เปลี่ยนแปลงค่าจะคืนค่า จึงสามารถเรียกต่อกันได้อย่างลื่นไหล

let result = [4, 2, 9, 1].sorted().map { $0 * 2 }
print(result)

รูปแบบเชิงฟังก์ชัน

การคืนค่าใหม่แทนการเปลี่ยนแปลงค่ารองรับรูปแบบเชิงฟังก์ชัน ซึ่งทดสอบและทำความเข้าใจได้ง่าย

struct Account {
    var balance: Int
    func deposited(_ n: Int) -> Account {
        return Account(balance: balance + n)
    }
}
let a0 = Account(balance: 0)
let a1 = a0.deposited(100).deposited(50)
print(a0.balance, a1.balance)

หลีกเลี่ยงข้อผิดพลาดจากสถานะร่วม

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

struct Settings {
    var volume: Int
    func with(volume newVolume: Int) -> Settings {
        return Settings(volume: newVolume)
    }
}
let base = Settings(volume: 5)
let loud = base.with(volume: 11)
print(base.volume, loud.volume)

เมื่อใดควรเปลี่ยนแปลงค่าแทน

หากคุณอัปเดตอินสแตนซ์เดียวซ้ำ ๆ ภายในลูป การเปลี่ยนแปลงค่าเดิมโดยตรงอาจมีประสิทธิภาพกว่าการสร้างสำเนาจำนวนมาก

var total = 0
for n in 1...5 {
    total += n
}
print(total)

มีให้เลือกทั้งสองรูปแบบ

ชนิดข้อมูลที่ออกแบบมาอย่างดีบางครั้งมีให้เลือกทั้งสองรูปแบบเช่นเดียวกับไลบรารีมาตรฐาน เพื่อให้ผู้เรียกเลือกได้ว่าจะเปลี่ยนแปลงค่าหรือสร้างค่าใหม่

struct Text {
    var value: String
    func uppercased() -> Text {
        return Text(value: value.uppercased())
    }
    mutating func uppercase() {
        value = value.uppercased()
    }
}
var t = Text(value: "hi")
let u = t.uppercased()
t.uppercase()
print(u.value, t.value)

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

ทดสอบการออกแบบที่ไม่เปลี่ยนแปลงค่า

สรุป

เมธอดที่ไม่เปลี่ยนแปลงค่าเป็นทางเลือกแทนการเปลี่ยนแปลงค่า โดยคืนค่าใหม่ที่นำการเปลี่ยนแปลงไปใช้แล้วและคงค่าดั้งเดิมไว้ อีกทั้งยังใช้กับอินสแตนซ์ let ได้ หลักการของ Swift จับคู่ชื่อคำกริยาเชิงคำสั่ง (sort) กับชื่อที่ลงท้ายด้วย -ed/-ing (sorted)

let a = [3, 1, 2]
let b = a.sorted()
print(a, b)

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

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

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

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

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

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

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

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

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

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

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

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

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