Пользовательские настройки по умолчанию - это система хранения файлов.Существует мало смысла в создании подклассов, если вы не хотите изменить его логику.Но вы можете создать несколько мастей, таких как UserDefaults(suiteName: String)
.Что вы ожидаете от подклассов?Вы можете просто глобально определить let myDefaults = UserDefaults(suiteName: String)
и использовать его где угодно.Я думаю, вы могли бы использовать такие методы, как
class MyDefaults: UserDefaults {
func saveName(_ name: String) {
setValue(name, forKey: "name_key")
}
}
Но с другой стороны, может иметь смысл создать расширение
extension UserDefaults {
func saveName(_ name: String) {
setValue(name, forKey: "name_key")
}
}
или сделать его немного более сложным:
extension UserDefaults {
struct User {
static let defaults = UserDefaults(suiteName: "User")
static func saveName(_ name: String) {
defaults.setValue(name, forKey: "name")
}
}
struct General {
static let defaults = UserDefaults.standard
static func saveLastOpened(date: Date) {
defaults.setValue(date, forKey: "last_opened")
}
}
}
Но все они имеют один фатальный поток: теперь вы зависите от использования пользовательских настроек по умолчанию в приложении.В какой-то момент может возникнуть необходимость сохранить эти данные в другой форме, например в локальном файле JSON, синхронизированном с iCloud.Я думаю, что UserDefaults.User
можно изменить, чтобы сделать это, но это будет очень уродливо.Мы хотим не UserDefaults.User.saveName("My name")
, а User.saveName("My name")
.С точки зрения интерфейса нам не важно, где будет сохранено это имя пользователя, и если будет введена новая система для сохранения этих данных, нам не нужно изменение интерфейса.
Другими словами, представьте, что вы используете UserDefaults.User.saveName
на 100 мест в вашем приложении и теперь хотите использовать другую систему для сохранения имени пользователя.Теперь вам нужно изменить код на 100 мест, чтобы использовать AnotherSystem.User.saveName
, в то время как если вы просто используете User.saveName
, интерфейс все еще действителен.
Таким образом, суть в том, что нет смысла (в значительной степени) изменять, расширение или создание подкласса UserDefaults
, потому что лучше создать систему с оболочкой UserDefaults
, которая впоследствии может быть изменена на любую другую систему.