Casting in Swift 1.2

as

Swift ยกให้อักษรเล็กๆ สองตัวนี้มีความรับผิดชอบที่ยิ่งใหญ่ในภาษา
และหน้าหลักของมันก็คือ "การแปลง" ซึ่งประกอบไปด้วย การแปลงขึ้น (Upcasting) แปลงกลับ (Downcasting) แปลงแล้วเช็คให้ (ใช้ร่วมกับแนวคิด Optional) และการบังคับแปลง (Forced Casting)

ซึ่งใน Swift 1.2 นี้ได้เพิ่มความสามารถให้เจ้า as เข้ามาอีกครับ
ถ้ายังไงเปิดเข้ามาเจออันนี้อยากให้ลองกลับไปอ่านอันนี้ก่อน Any Object and Swift Type Casting

พอเราเจาะลึกเรื่องของ as แล้วก็จะแบ่งหน้าที่ของมันได้เป็นข้อๆ ดังนี้

1. The Optional Cast


คล้ายกับภาษาโปรแกรมสมัยใหม่อื่นๆ ไม่แปลกที่ตัวแปรหรือค่าคงที่ใดๆ ชนิดใดๆ สามารถที่จะอ้างอิงถึง subclass ของมันเอง (Downcasting) และเรื่องจากความยืดหยุ่นข้อนี้ ก็มักจะต้องไปอ้างอิงชนิดตัวแปรที่ถูกต้องกันในขณะ runtime (หมายความว่า ถ้าเกิดปัญหาขึ้นโปรแกรมจะแครช (Runtime Error) ทันที)

แต่ใน Swift เมื่อทำ Optional Casting หมายความว่าเรากำลังบอก compiler ว่าการ casting ที่เรากำลังทำอยู่นี้อาจจะส่งค่า nil กลับมานะ ซึ่งจะเป็นการเช็คก่อนนำไปใช้ และเป็นวิธีที่มีประสิทธิภาพ แล้วเหตุการณ์ปกติที่เราจะใช้มันล่ะ ?


นอกจากนี้เหตุการณ์อื่นๆ ก็อย่างเช่น เวลาที่จะใช้แปลงตัวแปรชนิด Any และ AnyObject เพื่อให้เป็นชนิดที่เราคาดหวังไว้ (เช่นตอนที่ทำ JSON Parsing) ซึ่งมีโอกาสเป็น nil ได้แน่นอน ถ้าข้อมูลที่รับมาจากเซิร์ฟเวอร์เกิดข้อผิดพลาดขึ้น

2. The Guaranteed Cast

แต่ถ้ามั่นใจมากๆ ว่ามันจะแปลงสำเร็จแน่ๆ ก็แค่เอาสัญลักษณ์ Optional (?) ออกไป เช่นตัวอย่างยากๆ อันนี้

แม้ว่าเราแค่มองก็รู้แล้วว่า 1 ควรจะเป็น Int แต่ Swift ก็มองให้มันเป็น Double ได้เหมือนกัน โอเค มาถึงตัวอย่างจริงจังกันบ้าง เรามักจะใช้ในการทำ Upcasting แบบนี้


3. The Forced Conversion (Swift 1.2)

as! เป็นสิ่งที่เพิ่มเข้ามาใน Swift 1.2 และมีหน้าที่คล้ายคลึงกับการใช้ ! (Exclamation Mark) ในแบบอื่นๆ นั่นคือการแปลงแบบบังคับ

เรามาดูตัวอย่างกันอีกครั้ง


แต่การแปลงแบบนี้ จะใช้ได้ก็ต่อเมื่อเรามั่นใจแน่ๆ แล้วว่ามันจะต้องแปลงได้แน่ๆ มักใช้กับการแปลงชนิดของ Any และ AnyObject เช่นเคย เพราะจะทำให้เกิด Runtime Error ทันที ที่การแปลงไม่สำเร็จ ดังนั้นควรใช้อย่างระมัดระวัง

มีวิธีจำง่ายๆ เกี่ยวกับการใช้ ? (Question Mark) และ ! (Exclamation Mark) ใน Swift นั่นคือ ! อาจจะเป็นกับดัก และ ? หมายถึงอาจจะเป็น nil

สุดท้าย เรามาดูการใช้งาน as กับ switch บน Swift กัน



Popular posts from this blog

12 วิธี การบริการและดูแลลูกค้าในร้าน Starbucks

"อีสุกอีใส" ประสบการณ์เมื่อต้องมาเป็นตอนอายุ 22

[Android Dev] การติดตั้ง Eclipse+AndroidSDK เพื่อพัฒนาโปรแกรมบน Android