#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. Это было полезно. Спасибо!