2015-08-11 3 views
2

У меня есть служба настроек в моем проекте Swift, который определяет переменные для всех параметров, доступных в моем приложении. Для того, чтобы получить доступ к NSUserDefaults только тогда, когда это абсолютно необходимо (для того, чтобы избежать несущественных задержек), я использую переменные кэша для этих параметров:Как украсить «шаблон» кеша в Swift?

class SettingsService { 

    struct UserDefaults { 
     static let Setting1 = "Setting1" 
    } 

    private var setting1Cache : Bool? 
    var setting1 : Bool { 
     get { 
      if let value = setting1Cache { 
       return value 
      } 
      let value = NSUserDefaults.standardUserDefaults().boolForKey(UserDefaults.Setting1) 
      setting1Cache = value 
      return value 
     } 
     set { 
      setting1Cache = newValue 
      NSUserDefaults.standardUserDefaults().setBool(newValue, forKey: UserDefaults.Setting1) 
     } 
    } 
} 

Хотя код должен работать, класс скоро станет действительно раздутой, когда увеличивается количество доступных настроек. Есть ли способ сделать код значительно более кратким, помимо определения вспомогательной функции для первых 4 строк геттера?

+0

Вот некоторые интересные подходы: [NSUserDefaults в Swift - осуществление безопасности типа] (http://stackoverflow.com/вопросы/28136015/NSUserDefaults-в-скор-реализующей-типа-безопасности). –

ответ

1

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

enum Userdefaults { 
    case Setting1, Setting2 

    var key: String { 
     switch self { 
      case .Setting1: return "setting1key" 
      case .Setting2: return "setting2key" 
     } 

    var value: AnyObject { 
     switch self { 
      case .Setting1: return NSUserDefaults.standardUserDefaults().boolForKey(key) 
      case .Setting2: return NSUserDefaults.standardUserDefaults().stringForKey(key) 
     } 
    } 
Смежные вопросы