Swift ให้ความปลอดภัยระดับสูงแก่ผู้ใช้งาน ภาษา Swift ทั้งหมดได้รับการออกแบบโดยคำนึงถึงความปลอดภัยเป็นหลัก เป็นหนึ่งในเครื่องหมายรับรองคุณภาพของ Swift และเป็นสิ่งที่คุณควรต้อนรับด้วยอาวุธเปิด มันจะช่วยในการพัฒนาโค้ดที่สะอาดอ่านได้และช่วยป้องกันไม่ให้แอปพลิเคชันของคุณหยุดทำงาน
ตัวเลือกทั้งหมดใน Swift จะถูกกำหนดด้วย?
สัญลักษณ์ ด้วยการตั้งค่า?
ชื่อหลังจากชนิดที่คุณประกาศว่าเป็นตัวเลือกคุณกำลังส่งข้อความนี้ไม่ใช่ประเภทที่อยู่ก่อนหน้า?
แต่แทนที่จะเป็นประเภทที่เป็นทางเลือก
หมายเหตุ: ตัวแปรหรือประเภทInt
คือไม่ได้Int?
เช่นเดียวกับ พวกเขาเป็นสองประเภทที่แตกต่างกันที่ไม่สามารถดำเนินการกับแต่ละอื่น ๆ
ใช้ตัวเลือก
var myString: String?
myString = "foobar"
นี้ไม่ได้String
หมายความว่าคุณกำลังทำงานกับประเภทของ ซึ่งหมายความว่าคุณกำลังทำงานกับชนิดของString?
(สตริงเป็นทางเลือกหรือเป็นตัวเลือกสตริง) ในความเป็นจริงทุกครั้งที่คุณพยายาม
print(myString)
Optional("foobar")
ที่รันไทม์คอนโซลการแก้ปัญหาจะพิมพ์ ส่วน " Optional()
" บ่งชี้ว่าตัวแปรนี้อาจมีหรือไม่มีค่า ณ รันไทม์ แต่ก็เกิดขึ้นกับขณะนี้ที่มีสตริง "foobar" วันนี้ " Optional()
" ตัวบ่งชี้ที่จะยังคงอยู่จนกว่าคุณจะทำสิ่งที่เรียกว่า "แกะ" ค่าตัวเลือก
การแกะตัวเลือกหมายความว่าคุณกำลังแคสต์ประเภทนั้นเป็นแบบไม่บังคับ สิ่งนี้จะสร้างประเภทใหม่และกำหนดค่าที่อยู่ภายในตัวเลือกนั้นให้กับประเภทที่ไม่ใช่ตัวเลือกใหม่ วิธีนี้คุณสามารถดำเนินการกับตัวแปรนั้นตามที่ได้รับการรับรองโดยคอมไพเลอร์เพื่อให้มีค่าที่มั่นคง
การแกะแบบมีเงื่อนไขจะตรวจสอบว่าค่าในตัวเลือกเป็นnil
หรือไม่ หากไม่เป็นnil
เช่นนั้นจะมีตัวแปรคงที่ที่เพิ่งสร้างขึ้นใหม่ซึ่งจะถูกกำหนดค่าและแกะออกมาเป็นค่าคงที่ที่ไม่จำเป็น และจากที่นั่นคุณสามารถใช้ตัวเลือกที่ไม่จำเป็นในif
บล็อกได้อย่างปลอดภัย
หมายเหตุ: คุณสามารถให้ชื่อคงที่แบบไม่เปลี่ยนแปลงตามเงื่อนไขเหมือนกับตัวแปรทางเลือกที่คุณไม่ได้เปิดใช้
if let myString = myString {
print(myString)
// will print "foobar"
}
ตัวเลือกการเปิดใช้งานตามเงื่อนไขเป็นวิธีที่สะอาดที่สุดในการเข้าถึงค่าของทางเลือกเพราะถ้ามันมีค่าศูนย์ดังนั้นทุกอย่างภายในถ้าปล่อยให้บล็อกจะไม่ดำเนินการ แน่นอนเช่นใด ๆ ถ้าคำสั่งคุณอาจรวมบล็อกอื่น
if let myString = myString {
print(myString)
// will print "foobar"
}
else {
print("No value")
}
การบังคับใช้ Unwrappingดำเนินการโดยใช้สิ่งที่เรียกว่าตัวดำเนินการ!
("bang") วิธีนี้มีความปลอดภัยน้อยกว่า แต่ยังช่วยให้โค้ดของคุณสามารถคอมไพล์ได้ อย่างไรก็ตามเมื่อใดก็ตามที่คุณใช้ตัวดำเนินการบางอย่างคุณจะต้องแน่ใจว่าตัวแปรของคุณมีค่าที่เป็นของแข็งก่อนที่จะบังคับแกะ
var myString: String?
myString = "foobar"
print(myString!)
ข้างต้นนี้เป็นรหัส Swift ที่ถูกต้องทั้งหมด มันพิมพ์ค่าของmyString
ที่ถูกตั้งค่าเป็น "foobar" ผู้ใช้จะเห็นfoobar
พิมพ์ในคอนโซลและที่เกี่ยวกับมัน แต่สมมติว่าไม่มีการตั้งค่า:
var myString: String?
print(myString!)
ตอนนี้เรามีสถานการณ์ที่แตกต่างกันในมือของเรา แตกต่างจาก Objective-C เมื่อใดก็ตามที่มีความพยายามบังคับให้แกะตัวเลือกเพิ่มเติมและยังไม่ได้ตั้งค่าตัวเลือกและnil
เมื่อคุณพยายามแกะตัวเลือกเพื่อดูว่ามีอะไรอยู่ในแอปพลิเคชันของคุณ
unwrapping w / ประเภทหล่อ ดังที่เราได้กล่าวไว้ก่อนหน้านี้ว่าในขณะที่คุณเป็นunwrapping
ตัวเลือกคุณกำลังส่งให้กับประเภทที่ไม่ใช่ตัวเลือก แต่คุณสามารถใช้ตัวเลือกที่ไม่ใช่ตัวเลือกประเภทอื่นได้ ตัวอย่างเช่น:
var something: Any?
บางแห่งในรหัสของเราตัวแปรsomething
จะได้รับการตั้งค่าบางอย่าง บางทีเรากำลังใช้ยาชื่อสามัญหรืออาจมีเหตุผลอื่นที่เกิดขึ้นซึ่งจะทำให้สิ่งนี้เปลี่ยนแปลง ดังนั้นภายหลังในรหัสของเราที่เราต้องการใช้something
แต่ก็ยังสามารถรักษาได้แตกต่างกันถ้ามันเป็นประเภทที่แตกต่างกัน ในกรณีนี้คุณจะต้องใช้as
คำหลักเพื่อกำหนดสิ่งนี้:
หมายเหตุ: as
ผู้ประกอบการเป็นวิธีที่คุณพิมพ์ cast ใน Swift
// Conditionally
if let thing = something as? Int {
print(thing) // 0
}
// Optionally
let thing = something as? Int
print(thing) // Optional(0)
// Forcibly
let thing = something as! Int
print(thing) // 0, if no exception is raised
สังเกตเห็นความแตกต่างระหว่างas
คำหลักสองคำ เหมือนเมื่อก่อนที่เราบังคับเปิดใช้งานอุปกรณ์เสริมเราใช้ตัว!
ดำเนินการบางอย่างเพื่อทำเช่นนั้น ที่นี่คุณจะทำสิ่งเดียวกัน Int
แต่แทนที่จะหล่อเป็นเพียงไม่เลือกคุณกำลังหล่อก็ยังเป็น และจะต้องสามารถดาวน์สตรีมเป็นInt
อย่างอื่นเช่นใช้ตัวดำเนินการบางอย่างเมื่อค่าเป็นnil
แอปพลิเคชันของคุณจะผิดพลาด
และเพื่อที่จะใช้ตัวแปรเหล่านี้ในการดำเนินการเรียงลำดับหรือทางคณิตศาสตร์พวกเขาจะต้องได้รับการปลดเพื่อที่จะทำเช่นนั้น
ตัวอย่างเช่นใน Swift เฉพาะประเภทข้อมูลตัวเลขที่ถูกต้องซึ่งเป็นประเภทเดียวกันเท่านั้นที่สามารถใช้งานร่วมกันได้ เมื่อคุณส่งชนิดที่มีการas!
บังคับให้คุณลดระดับลงของตัวแปรนั้นราวกับว่าคุณแน่ใจว่าเป็นประเภทนั้นดังนั้นจึงปลอดภัยในการทำงานและไม่ทำให้แอปพลิเคชันของคุณเสียหาย มันก็โอเคตราบใดที่ตัวแปรนั้นเป็นประเภทที่คุณกำลังขว้างอยู่ไม่งั้นคุณจะยุ่งเหยิง
อย่างไรก็ตามการแคสต์ด้วยas!
จะทำให้โค้ดของคุณรวบรวม ด้วยการคัดเลือกนักแสดงที่มีas?
เนื้อเรื่องที่แตกต่างออกไป ในความเป็นจริงas?
ประกาศว่าคุณInt
เป็นประเภทข้อมูลที่แตกต่างกันอย่างสิ้นเชิงทั้งหมดเข้าด้วยกัน
ตอนนี้มันเป็น Optional(0)
และถ้าคุณเคยพยายามทำการบ้านของคุณเขียนสิ่งที่ชอบ
1 + Optional(1) = 2
ครูคณิตศาสตร์ของคุณน่าจะให้ "F" แก่คุณ เช่นเดียวกับ Swift ยกเว้นสวิฟท์จะไม่รวบรวมเลยแทนที่จะให้เกรด เพราะในตอนท้ายของวันนี้อาจจะเป็นตัวเลือกในความเป็นจริงจะเป็นศูนย์
ปลอดภัยไว้ก่อน