อัปเดต:จากบันทึกการเปลี่ยนแปลงของSwift 2.2 (เผยแพร่เมื่อวันที่ 21 มีนาคม 2559):
ตัวเริ่มต้นคลาสที่กำหนดซึ่งประกาศว่าล้มเหลวหรือการขว้างปาอาจส่งคืนศูนย์หรือเกิดข้อผิดพลาดตามลำดับก่อนที่วัตถุจะเริ่มต้นอย่างสมบูรณ์
สำหรับ Swift 2.1 และรุ่นก่อนหน้า:
ตามเอกสารของ Apple (และข้อผิดพลาดของคอมไพเลอร์ของคุณ) คลาสจะต้องเตรียมใช้งานคุณสมบัติที่เก็บไว้ทั้งหมดก่อนที่จะกลับมาnil
จากตัวเริ่มต้นที่ล้มเหลว:
อย่างไรก็ตามสำหรับคลาสตัวเริ่มต้นที่ล้มเหลวสามารถทริกเกอร์ความล้มเหลวในการเตรียมใช้งานได้หลังจากที่คุณสมบัติที่จัดเก็บทั้งหมดที่แนะนำโดยคลาสนั้นได้รับการตั้งค่าเป็นค่าเริ่มต้นและมีการมอบสิทธิ์ initializer
หมายเหตุ:มันใช้งานได้ดีสำหรับโครงสร้างและการแจงนับไม่ใช่คลาสเท่านั้น
วิธีที่แนะนำในการจัดการคุณสมบัติที่จัดเก็บไว้ซึ่งไม่สามารถเตรียมใช้งานได้ก่อนที่โปรแกรมเริ่มต้นจะล้มเหลวคือการประกาศว่าเป็นตัวเลือกที่ไม่ได้ปิดกั้นโดยปริยาย
ตัวอย่างจากเอกสาร:
class Product {
let name: String!
init?(name: String) {
if name.isEmpty { return nil }
self.name = name
}
}
ในตัวอย่างข้างต้นคุณสมบัติชื่อของคลาสผลิตภัณฑ์ถูกกำหนดให้มีประเภทสตริงที่เป็นทางเลือก (String!) เนื่องจากเป็นประเภททางเลือกซึ่งหมายความว่าคุณสมบัติ name มีค่าดีฟอลต์เป็นศูนย์ก่อนที่จะกำหนดค่าเฉพาะระหว่างการเตรียมใช้งาน ค่าเริ่มต้นของศูนย์นี้หมายความว่าคุณสมบัติทั้งหมดที่นำมาใช้โดยคลาสผลิตภัณฑ์มีค่าเริ่มต้นที่ถูกต้อง เป็นผลให้ตัวเริ่มต้นที่ล้มเหลวสำหรับผลิตภัณฑ์สามารถทริกเกอร์ความล้มเหลวในการกำหนดค่าเริ่มต้นเมื่อเริ่มต้นตัวเริ่มต้นหากส่งผ่านสตริงว่างก่อนกำหนดค่าเฉพาะให้กับคุณสมบัติชื่อภายในตัวเริ่มต้น
ในกรณีของคุณ แต่เพียงการกำหนดuserName
เป็นไม่สามารถแก้ไขรวบรวมข้อผิดพลาดเพราะคุณยังต้องกังวลเกี่ยวกับการเริ่มต้นคุณสมบัติในระดับฐานของคุณString!
NSObject
โชคดีที่userName
กำหนดเป็น a String!
คุณสามารถโทรได้super.init()
ก่อนที่คุณreturn nil
จะเริ่มNSObject
คลาสพื้นฐานของคุณและแก้ไขข้อผิดพลาดในการคอมไพล์
class User: NSObject {
let userName: String!
let isSuperUser: Bool = false
let someDetails: [String]?
init?(dictionary: NSDictionary) {
super.init()
if let value = dictionary["user_name"] as? String {
self.userName = value
}
else {
return nil
}
if let value: Bool = dictionary["super_user"] as? Bool {
self.isSuperUser = value
}
self.someDetails = dictionary["some_details"] as? Array
}
}
canSetCalculableProperties
พารามิเตอร์บูลีนเพื่อให้ผู้เริ่มต้นคำนวณคุณสมบัติที่สามารถสร้างหรือไม่สามารถสร้างได้ทันที ตัวอย่างเช่นหากdateCreated
คีย์หายไปและฉันสามารถตั้งค่าคุณสมบัติได้ทันทีเนื่องจากcanSetCalculableProperties
พารามิเตอร์เป็นจริงฉันก็แค่ตั้งค่าเป็นวันที่ปัจจุบัน