ฉันกำลังพยายามหาโมเดลซิงเกิลที่เหมาะสมสำหรับการใช้งานใน Swift จนถึงตอนนี้ฉันสามารถรับแบบจำลองความปลอดภัยที่ไม่มีเธรดทำงานเป็น:
class var sharedInstance: TPScopeManager {
get {
struct Static {
static var instance: TPScopeManager? = nil
}
if !Static.instance {
Static.instance = TPScopeManager()
}
return Static.instance!
}
}
การตัดอินสแตนซ์ซิงเกิลตันในโครงสร้างแบบคงที่ควรอนุญาตอินสแตนซ์เดี่ยวที่ไม่ขัดแย้งกับอินสแตนซ์ซิงเกิลโดยไม่มีแผนการตั้งชื่อที่ซับซ้อนและควรทำให้สิ่งต่างๆเป็นส่วนตัวอย่างเป็นธรรม แน่นอนว่ารุ่นนี้ไม่ปลอดภัยสำหรับเธรด ดังนั้นฉันจึงพยายามที่จะเพิ่มdispatch_once
สิ่งทั้งหมด:
class var sharedInstance: TPScopeManager {
get {
struct Static {
static var instance: TPScopeManager? = nil
static var token: dispatch_once_t = 0
}
dispatch_once(Static.token) { Static.instance = TPScopeManager() }
return Static.instance!
}
}
แต่ฉันได้รับข้อผิดพลาดของคอมไพเลอร์ในdispatch_once
บรรทัด:
ไม่สามารถแปลงประเภทของนิพจน์ 'Void' เป็น type '()'
ฉันได้ลองใช้รูปแบบที่แตกต่างหลากหลายของไวยากรณ์ แต่พวกเขาดูเหมือนจะมีผลลัพธ์เดียวกัน:
dispatch_once(Static.token, { Static.instance = TPScopeManager() })
การdispatch_once
ใช้ Swift ที่เหมาะสมคืออะไร ตอนแรกฉันคิดว่าปัญหาเกิดขึ้นกับบล็อคเนื่องจาก()
ในข้อความแสดงข้อผิดพลาด แต่ยิ่งฉันมองมันมากเท่าไรฉันก็ยิ่งคิดว่ามันอาจเป็นเรื่องของการได้รับการdispatch_once_t
กำหนดอย่างถูกต้อง
@lazy
ควรปลอดภัยเธรด
Static.instance = TPScopeManager()
กองกำลังประเภทอินสแตนซ์ หากคุณใช้บางอย่างเช่นStatic.instance = self()
กับ initializer ที่ต้องการคลาสประเภทที่เหมาะสมจะถูกสร้างขึ้น ถึงกระนั้นและนี่คือสิ่งสำคัญที่ควรทราบเพียงครั้งเดียวสำหรับอินสแตนซ์ทั้งหมดในลำดับชั้น! First type to initialize เป็นประเภทที่กำหนดไว้สำหรับทุกอินสแตนซ์ ฉันไม่คิดว่าวัตถุประสงค์ -c ทำตัวเหมือนกัน