as
ใช้สำหรับ upcasting และ type casting เป็น bridged type
as?
ใช้สำหรับการหล่ออย่างปลอดภัยส่งคืนศูนย์หากล้มเหลว
as!
ใช้ในการบังคับให้แคสต์ผิดพลาดหากล้มเหลว
บันทึก:
as!
ไม่สามารถแคสต์ประเภทดิบเป็นทางเลือกได้
ตัวอย่าง:
let rawString: AnyObject = "I love swift"
let optionalString: AnyObject? = "we love swift"
let nilString: AnyObject? = (nil as String?)
let rawInt: AnyObject = Int(3)
let optionalInt: AnyObject? = Int(3)
let nilInt: AnyObject? = (nil as Int?)
ตัวอย่าง
var age: Int? = nil
var height: Int? = 180
โดยการเพิ่ม? ทันทีหลังจากชนิดข้อมูลคุณบอกคอมไพเลอร์ว่าตัวแปรอาจมีตัวเลขหรือไม่ เรียบร้อย! สังเกตว่าการกำหนดค่าคงที่เป็นทางเลือกนั้นไม่สมเหตุสมผลนักคุณสามารถกำหนดค่าได้เพียงครั้งเดียวดังนั้นคุณจะสามารถบอกได้ว่าค่าของพวกเขาจะเป็นศูนย์หรือไม่
เราควรใช้ "?" เมื่อใด และเมื่อ "!"
สมมติว่าเรามีแอพง่ายๆที่ใช้ UIKit เรามีโค้ดบางส่วนในตัวควบคุมมุมมองของเราและต้องการนำเสนอตัวควบคุมมุมมองใหม่ที่ด้านบน และเราจำเป็นต้องตัดสินใจที่จะผลักดันมุมมองใหม่บนหน้าจอโดยใช้ตัวควบคุมการนำทาง
ดังที่เราทราบทุกอินสแตนซ์ ViewController มีตัวควบคุมการนำทางคุณสมบัติ หากคุณกำลังสร้างแอปที่ใช้ตัวควบคุมการนำทางคุณสมบัติของตัวควบคุมมุมมองหลักของแอปจะถูกตั้งค่าโดยอัตโนมัติและคุณสามารถใช้เพื่อผลักดันหรือตัวควบคุมมุมมองป๊อปอัป หากคุณใช้เทมเพลตโปรเจ็กต์ของแอปเดียวจะไม่มีตัวควบคุมการนำทางที่สร้างขึ้นโดยอัตโนมัติสำหรับคุณดังนั้นตัวควบคุมมุมมองเริ่มต้นของแอปของคุณจะไม่มีสิ่งใดเก็บไว้ในคุณสมบัติ navigationController
ฉันแน่ใจว่าคุณเดาอยู่แล้วว่านี่เป็นกรณีของประเภทข้อมูลเสริม หากคุณตรวจสอบ UIViewController คุณจะเห็นว่าคุณสมบัติถูกกำหนดเป็น:
var navigationController: UINavigationController? { get }
ลองกลับไปที่กรณีการใช้งานของเรา หากคุณทราบข้อเท็จจริงว่าตัวควบคุมมุมมองของคุณมักจะมีตัวควบคุมการนำทางคุณสามารถดำเนินการต่อและบังคับให้แกะออกได้:
controller.navigationController!.pushViewController(myViewController, animated: true)
เมื่อคุณใส่! ข้างหลังชื่อคุณสมบัติที่คุณบอกคอมไพเลอร์ฉันไม่สนใจว่าคุณสมบัตินี้เป็นทางเลือกฉันรู้ว่าเมื่อรหัสนี้ดำเนินการจะมีที่เก็บค่าอยู่เสมอดังนั้นให้ปฏิบัติต่อตัวเลือกนี้เหมือนประเภทข้อมูลปกติ ไม่ดีเหรอ? จะเกิดอะไรขึ้นแม้ว่าจะไม่มีตัวควบคุมการนำทางไปยังตัวควบคุมมุมมองของคุณ หากคุณแนะนำว่าจะมีค่าที่เก็บไว้ใน navigationController ผิดหรือไม่? แอปของคุณจะขัดข้อง เรียบง่ายและน่าเกลียดเป็นอย่างนั้น
ดังนั้นใช้! เฉพาะในกรณีที่คุณมั่นใจ 101% ว่าปลอดภัย
ถ้าคุณไม่แน่ใจว่าจะมีตัวควบคุมการนำทางอยู่เสมอหรือไม่? แล้วคุณสามารถใช้? แทนที่จะเป็น!:
controller.navigationController?.pushViewController(myViewController, animated: true)
อะไรกัน? ด้านหลังชื่อคุณสมบัติบอกคอมไพเลอร์คือฉันไม่รู้ว่าคุณสมบัตินี้มีศูนย์หรือค่าดังนั้น: ถ้ามันมีค่าให้ใช้มันและในทางกลับกันให้พิจารณานิพจน์ทั้งหมด nil ได้อย่างมีประสิทธิภาพ? อนุญาตให้คุณใช้คุณสมบัตินั้นในกรณีที่มีตัวควบคุมการนำทาง ไม่ว่าจะมีการตรวจสอบชนิดใด ๆ หรือการหล่อใด ๆ ไวยากรณ์นี้เหมาะอย่างยิ่งเมื่อคุณไม่สนใจว่าคุณจะมีตัวควบคุมการนำทางหรือไม่และต้องการทำบางอย่างเฉพาะเมื่อมี
ขอบคุณมากสำหรับFantageek