ข้อควรระวัง: เงื่อนไขของคนธรรมดาข้างหน้า
คำอธิบายนี้ไม่ถูกต้องอย่างจริงจังในระดับรหัสที่สำคัญที่สุด อย่างไรก็ตามมีการตรวจสอบโดยผู้ชายที่ใช้งาน Swift จริงและเขาบอกว่ามันดีพอเป็นคำอธิบายพื้นฐาน
ดังนั้นผมจึงต้องการที่จะพยายามที่จะเพียงและโดยตรงตอบคำถามของ "ทำไม"
เพื่อความแม่นยำ: เหตุใดเราจึงต้องทำเครื่องหมายฟังก์ชันของโครงสร้างmutating
เมื่อเราสามารถเปลี่ยนพารามิเตอร์โครงสร้างโดยไม่ต้องแก้ไขคำสำคัญใด ๆ
ดังนั้นภาพรวมมันมีส่วนเกี่ยวข้องกับปรัชญาที่ทำให้ Swift swift
คุณอาจคิดว่ามันเหมือนกับปัญหาในการจัดการที่อยู่จริง เมื่อคุณเปลี่ยนที่อยู่หากมีคนจำนวนมากที่มีที่อยู่ปัจจุบันของคุณคุณต้องแจ้งให้ทุกคนทราบว่าคุณได้ย้ายไปแล้ว แต่ถ้าไม่มีใครมีที่อยู่ปัจจุบันของคุณคุณก็สามารถย้ายไปที่ใดก็ได้ที่คุณต้องการและไม่มีใครต้องรู้
ในสถานการณ์เช่นนี้ Swift ก็เหมือนกับที่ทำการไปรษณีย์ หากผู้คนจำนวนมากที่มีรายชื่อติดต่อจำนวนมากย้ายไปรอบ ๆ จำนวนมากแสดงว่ามีค่าใช้จ่ายสูงมาก ต้องจ่ายพนักงานจำนวนมากเพื่อจัดการการแจ้งเตือนเหล่านั้นทั้งหมดและกระบวนการนี้ต้องใช้เวลาและความพยายามอย่างมาก นั่นเป็นเหตุผลที่สถานะในอุดมคติของ Swift คือให้ทุกคนในเมืองมีผู้ติดต่อให้น้อยที่สุด จากนั้นไม่จำเป็นต้องมีพนักงานจำนวนมากในการจัดการการเปลี่ยนแปลงที่อยู่และสามารถทำทุกอย่างได้เร็วขึ้นและดีขึ้น
นี่คือสาเหตุที่ Swift-folks ต่างพากันคลั่งไคล้ประเภทมูลค่าเทียบกับประเภทอ้างอิง โดยธรรมชาติแล้วประเภทการอ้างอิงจะเพิ่ม "รายชื่อติดต่อ" ไว้ทั่วทุกที่และประเภทค่ามักไม่ต้องการมากกว่าคู่ ประเภทค่าคือ "Swift" -er
กลับไปที่ภาพเล็ก: structs
. โครงสร้างเป็นเรื่องใหญ่ใน Swift เพราะสามารถทำสิ่งต่างๆได้เกือบทั้งหมด แต่เป็นประเภทมูลค่า
Let 's ยังคงคล้ายคลึงอยู่ทางกายภาพโดยจินตนาการที่อาศัยอยู่ในmisterStruct
someObjectVille
การเปรียบเทียบเริ่มขึ้นเล็กน้อยที่นี่ แต่ฉันคิดว่ามันยังมีประโยชน์
ดังนั้นในการสร้างแบบจำลองการเปลี่ยนตัวแปรใน a struct
สมมติว่าmisterStruct
มีผมสีเขียวและได้รับคำสั่งให้เปลี่ยนเป็นผมสีน้ำเงิน การเปรียบเทียบได้รับความสับสนเหมือนที่ฉันพูด แต่สิ่งที่เกิดขึ้นคือแทนที่จะเปลี่ยนmisterStruct
ทรงผมคนเก่าก็ย้ายออกไปและคนใหม่ที่มีผมสีฟ้าก็ย้ายเข้ามาและคนใหม่คนนั้นก็เริ่มเรียกตัวเองmisterStruct
ว่า ไม่มีใครต้องรับการแจ้งเปลี่ยนที่อยู่ แต่ถ้าใครดูที่อยู่นั้นก็จะเห็นผู้ชายผมสีฟ้า
ทีนี้ลองจำลองสิ่งที่เกิดขึ้นเมื่อคุณเรียกใช้ฟังก์ชันบนไฟล์struct
. ในกรณีนี้ก็เหมือนกับmisterStruct
ได้รับคำสั่งเช่นchangeYourHairBlue()
. ไปรษณีย์จึงส่งคำสั่งให้misterStruct
"ไปเปลี่ยนผมเป็นสีน้ำเงินแล้วบอกฉันว่าเสร็จเมื่อไร"
ถ้าเขาทำตามกิจวัตรเดิม ๆ เหมือนเดิมถ้าเขาทำในสิ่งที่ทำเมื่อตัวแปรเปลี่ยนไปโดยตรงสิ่งที่misterStruct
จะทำคือย้ายออกจากบ้านของเขาเองและโทรหาคนใหม่ที่มีผมสีฟ้า แต่นั่นคือปัญหา
คำสั่งคือ "ไปเปลี่ยนผมของคุณเป็นสีน้ำเงินแล้วบอกฉันเมื่อคุณทำเสร็จแล้ว" แต่เป็นคนชุดเขียวที่ได้รับคำสั่งนั้น หลังจากที่ผู้ชายสีฟ้าย้ายเข้ามาแล้วการแจ้งเตือน "งานเสร็จสมบูรณ์" ยังคงต้องส่งกลับไป แต่ผู้ชายสีฟ้าไม่รู้เรื่องเลย
[เพื่อให้เกิดการเปรียบเทียบที่น่ากลัวนี้จริงๆสิ่งที่เกิดขึ้นในทางเทคนิคกับผู้ชายผมสีเขียวคือหลังจากที่เขาย้ายออกไปเขาก็ฆ่าตัวตายทันที ดังนั้นเขาจึงไม่สามารถแจ้งใครได้ว่างานเสร็จแล้ว! ]
เพื่อหลีกเลี่ยงปัญหานี้ในกรณีเช่นนี้เท่านั้น , สวิฟท์ได้ไปโดยตรงไปที่บ้านตามที่อยู่ที่และจริงเปลี่ยนผมที่อยู่อาศัยในปัจจุบัน นั่นเป็นกระบวนการที่แตกต่างอย่างสิ้นเชิงกับการส่งผู้ชายคนใหม่
และนั่นคือเหตุผลที่ Swift ต้องการให้เราใช้mutating
คีย์เวิร์ด!
ผลลัพธ์ที่ได้ดูเหมือนกับสิ่งที่ต้องอ้างถึงโครงสร้าง: ผู้อยู่อาศัยในบ้านตอนนี้มีผมสีฟ้า แต่กระบวนการในการบรรลุเป้าหมายนั้นแตกต่างกันอย่างสิ้นเชิง ดูเหมือนว่ากำลังทำสิ่งเดียวกัน แต่มันทำสิ่งที่แตกต่างกันมาก มันกำลังทำสิ่งที่Swift Structs โดยทั่วไปไม่เคยทำ
ดังนั้นเพื่อให้คอมไพเลอร์ที่ไม่ดีช่วยเล็กน้อยและไม่ต้องคิดว่าฟังก์ชันกลายพันธุ์struct
หรือไม่ด้วยตัวมันเองสำหรับทุกฟังก์ชัน struct เดียวเราจึงขอให้สงสารและใช้mutating
คีย์เวิร์ด
โดยพื้นฐานแล้วเพื่อช่วยให้ Swift มีความรวดเร็วเราทุกคนต้องทำหน้าที่ของเรา :)