Tôi đang cố gắng tạo ra một mô hình singleton thích hợp để sử dụng trong Swift. Cho đến nay, tôi đã có thể có được một mô hình an toàn không có luồng hoạt động như:
class var sharedInstance: TPScopeManager {
get {
struct Static {
static var instance: TPScopeManager? = nil
}
if !Static.instance {
Static.instance = TPScopeManager()
}
return Static.instance!
}
}
Việc bao bọc cá thể đơn lẻ trong cấu trúc tĩnh sẽ cho phép một cá thể đơn lẻ không va chạm với các cá thể đơn lẻ mà không có các sơ đồ đặt tên phức tạp và nó sẽ làm cho mọi thứ khá riêng tư. Rõ ràng, mặc dù, mô hình này không an toàn chủ đề. Vì vậy, tôi đã cố gắng để thêm dispatch_once
vào toàn bộ:
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!
}
}
Nhưng tôi gặp lỗi trình biên dịch trên dispatch_once
dòng:
Không thể chuyển đổi loại 'Void' thành loại '()'
Tôi đã thử một số biến thể khác nhau của cú pháp, nhưng tất cả chúng đều có cùng kết quả:
dispatch_once(Static.token, { Static.instance = TPScopeManager() })
Cách sử dụng thích hợp của dispatch_once
việc sử dụng Swift là gì? Ban đầu tôi nghĩ vấn đề là do khối ()
thông báo lỗi, nhưng càng nhìn vào nó, tôi càng nghĩ rằng đó có thể là vấn đề của việc dispatch_once_t
xác định chính xác.
@lazy
nên được chủ đề an toàn.
Static.instance = TPScopeManager()
buộc loại thể hiện. Nếu bạn sử dụng một cái gì đó giống như Static.instance = self()
với một trình khởi tạo bắt buộc, lớp loại thích hợp sẽ được tạo. Mặc dù vậy, và đây là điều quan trọng cần lưu ý, chỉ một lần cho tất cả các trường hợp trong hệ thống phân cấp! Loại đầu tiên để khởi tạo là loại được đặt cho tất cả các trường hợp. Tôi không nghĩ khách quan-c cư xử như vậy.