Во-первых, как отметил в комментариях rmaddy, именно для этого и была разработана UserDefaults
. У меня такое ощущение, что вы используете его таким образом, что это стало бременем, которое очень прискорбно. Вот несколько вещей, которые вы можете сделать, чтобы сделать его более простым и понятным.
- Создать расширение
UserDefaults
в отдельном файле.
- Добавьте вычисленные значения к расширению, используя ключевое слово
#function
, которому вы можете присвоить имя значения UserDefaults
в качестве ключа, не используя жестко запрограммированную строку, которая может быть неправильно введена позже в коде.
- Используйте
enum
для инкапсуляции связанных значений, таких как флаги вашей функции.
- В зависимости от вашего использования вы можете добавлять пользовательские функции к вычисляемым значениям или функциям сопутствующих связей.
UserDefaults.swift
import Foundation
// MARK: - Features
/// Names of Features to be later accessed by raw value.
enum Features: String {
case FeatureZ
case FeatureX
case FeatureW
}
extension UserDefaults {
// MARK: - Onboarding
/// Indicates whether or not the user completed account setup.
/// - Returns: Bool
var finishedAcountSetup: Bool {
get { return bool(forKey: #function) }
set { set(newValue, forKey: #function) }
}
/// Indicates whether or not the user completed the first part of onboarding
/// - Returns: Bool
var primaryOnboarding: Bool {
get { return bool(forKey: #function) }
set { set(newValue, forKey: #function) }
}
// counter for displaying the tool tip
private var counterForToolTip: Int {
get { return integer(forKey: #function) }
set { set(newValue, forKey: #function) }
}
// Indicates whether or not the tool tip be shown
var shouldShowToolTip: Bool {
get {
if (counterForToolTip > 2) {
counterForToolTip = 0
return true
}
return false
}
}
var featureFlags: [String] {
get {
guard let array = stringArray(forKey: #function) else {
return []
}
return array
}
set { set(newValue, forKey: #function) }
}
// Convience functions
/// Sets all onboarding values
func setAllOnboarding(to: Bool) {
var onboardingValues = [finishedAcountSetup, primaryOnboarding]
for (index, _) in onboardingValues.enumerated() {
onboardingValues[index] = to
}
}
/// Increment the tool tip counter by a integer
/// If the counter is > 2 then the tool tip can show.
func incrementToolTipCounter(by: Int = 1){
counterForToolTip += by
}
}
Тем временем, в другом месте ...
UserDefaults.standard.featureFlags.append(Features.FeatureX.rawValue)
UserDefaults.standard.finishedAcountSetup = true
UserDefaults.standard.setAllOnboarding(to: false)
UserDefaults.standard.incrementToolTipCounter()
for (index, _ ) in UserDefaults.standard.featureFlags.enumerated() {
print("\(UserDefaults.standard.featureFlags[index])")
}
if (UserDefaults.standard.featureFlags.contains(Features.FeatureX.rawValue)) {
// Do something
}
// etc.