Почему бы не использовать синглтон на основе структуры в Swift

#swift #struct #singleton #swift5

Вопрос:

Почему бы не использовать синглтон на основе структуры?

Я создал синглтон на основе декодируемой структуры.

 struct Person: Decodable {  static var shared = Person()   private(set) var name: String?  var age: Int?    private init() {    }   mutating func initData(from data: Data) {  if let person = try? JSONDecoder().decode(Person.self, from: data) {  self = person  }  } }  

инициализация из другого класса, подобного этому:

 Person.shared.initData(from: data)  

и использовать параметры:

 let name = Person.shared.name  Person.shared.name = "MyName" //error   Person.shared.age = 20  

Это неправильный путь?

Ответ №1:

Вы не можете использовать структуру для одного элемента, потому struct что это тип значения, поэтому, когда вы назначаете его переменной, вы получаете копию. Это можно легко показать

 struct Singleton {  static var shared = Singleton()  var value: Int   private init() {  value = 0  } }  Singleton.shared.value = 1 var otherSingleton = Singleton.shared otherSingleton.value = 2  

Теперь, если мы напечатаем value оба

 print(Singleton.shared.value, otherSingleton.value)  

мы получаем

1 2

Это otherSingleton явно отдельный экземпляр, так что теперь у нас есть 2 синглета 🙂

Но если мы просто изменим тип Singleton класса на, который является ссылочным типом, а затем запустим тот же код, результат печати будет

2 2

поскольку это тот же экземпляр, для которого мы изменили value свойство.

Комментарии:

1. Можно ли использовать синглтон на основе структуры, если я не создаю и не использую отдельный экземпляр?

2. @user16114557 да, вы можете сделать все, если никогда не сделаете ничего плохого 😉 Смысл использования одного элемента в первую очередь заключается в том, что вы не можете создать несколько экземпляров по ошибке, и это легко может произойти, может быть, не сегодня, но когда-нибудь в будущем. Кроме того, если вы «знаете», что никогда не совершаете этой ошибки, тогда вам действительно не нужен синглтон, shared тогда достаточно использовать.

3. Это было полезно. Спасибо!