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 (?) ออกไป เช่นตัวอย่างยากๆ อันนี้
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 กัน
Comments
Post a Comment