Sự khác biệt chính là singleton có thể thay đổi dựa trên lớp, trong khi "singleton" có cấu trúc dựa trên cấu trúc thì không. Trừ khi bạn muốn làm cho singleton của bạn không thay đổi (đó là hiếm), bạn nên dính vào một lớp học dựa trên.
Đây là minh họa về cách "singleton" dựa trên cấu trúc có thể thay đổi không hoạt động. Hãy xem xét thêm một thành viên có thể thay đổi state
cho cả độc thân, như thế này:
class MyClassSingleton {
static let sharedInstance = MyClassSingleton()
private init(){}
var state = 5
func helloClass() { print("hello from class Singleton: \(state)") }
}
struct MyStructSingleton {
static let sharedInstance = MyStructSingleton()
private init() {}
var state = 5
func helloStruct() { print("hello from struct Singleton: \(state)") }
}
tôi đã state
một var
, nhưng tôi có thể tiếp xúc với nó như là một thuộc tính chỉ đọc cộng với một phương pháp mutating; điều quan trọng là cả hai loại đều có thể thay đổi.
Nếu tôi làm điều này
let csi = MyClassSingleton.sharedInstance
csi.state = 42
MyClassSingleton.sharedInstance.helloClass()
42 được in, vì csi
là tham khảo các trường hợp chia sẻ.
Tuy nhiên, khi tôi làm điều tương tự với cấu trúc dựa trên singleton
var ssi = MyStructSingleton.sharedInstance
ssi.state = 42
MyStructSingleton.sharedInstance.helloStruct()
5 được in thay vào đó, vì ssi
là một bản sao của sharedInstance
, đó là, tất nhiên, một dấu hiệu cho thấy singleton của chúng tôi là không thực sự là một singleton.
thú vị, bằng cách sử dụng 'static var sharedInstance' thay vì' static let sharedInstance' làm cho nó xuất hiện để hoạt động. Là một bản sao mới của cấu trúc được tạo ra mỗi khi tôi gọi 'MyStructSingleton.sharedInstance'? –
@RunningTurtle Một bản sao mới của 'MyStructSingleton' được tạo ra khi bạn khai báo một biến mới của kiểu' MyStructSingleton'. Khi bạn gán 'sharedInstance' cho nó, cả hai trở nên giống nhau, nhưng chúng không giống nhau. Điều tương tự cũng xảy ra khi bạn truyền 'MyStructSingleton' làm tham số hoặc trả về nó từ một phương thức. – dasblinkenlight