Skip to content

Commit

Permalink
Using a property wrapper for UserDefaults backed application settings…
Browse files Browse the repository at this point in the history
… (RiotSettings).
  • Loading branch information
stefanceriu committed Aug 26, 2021
1 parent 495ce11 commit c88199a
Show file tree
Hide file tree
Showing 7 changed files with 243 additions and 626 deletions.
803 changes: 177 additions & 626 deletions Riot/Managers/Settings/RiotSettings.swift

Large diffs are not rendered by default.

61 changes: 61 additions & 0 deletions Riot/PropertyWrappers/UserDefaultsBackedPropertyWrapper.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
//
// Copyright 2021 New Vector Ltd
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//

// Taken from https://www.swiftbysundell.com/articles/property-wrappers-in-swift/

import Foundation

@propertyWrapper
struct UserDefault<Value> {

private let key: String
private let defaultValue: Value
private let storage: UserDefaults

init(key: String, defaultValue: Value, storage: UserDefaults = .standard) {
self.defaultValue = defaultValue
self.key = key
self.storage = storage
}

var wrappedValue: Value {
get {
let value = storage.value(forKey: key) as? Value
return value ?? defaultValue
}
set {
if let optional = newValue as? AnyOptional, optional.isNil {
storage.removeObject(forKey: key)
} else {
storage.setValue(newValue, forKey: key)
}
}
}
}

extension UserDefault where Value: ExpressibleByNilLiteral {
init(key: String, storage: UserDefaults = .standard) {
self.init(key: key, defaultValue: nil, storage: storage)
}
}

private protocol AnyOptional {
var isNil: Bool { get }
}

extension Optional: AnyOptional {
var isNil: Bool { self == nil }
}
1 change: 1 addition & 0 deletions RiotNSE/target.yml
Original file line number Diff line number Diff line change
Expand Up @@ -59,3 +59,4 @@ targets:
- path: ../Riot/Categories/String.swift
- path: ../Riot/Categories/Character.swift
- path: ../Riot/Managers/Widgets/WidgetConstants.m
- path: ../Riot/PropertyWrappers/UserDefaultsBackedPropertyWrapper.swift
1 change: 1 addition & 0 deletions RiotShareExtension/target.yml
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ targets:
- path: ../Riot/Categories/UISearchBar.swift
- path: ../Riot/Categories/String.swift
- path: ../Riot/Modules/Common/Recents/CellData/RecentCellData.m
- path: ../Riot/PropertyWrappers/UserDefaultsBackedPropertyWrapper.swift
- path: ../Riot/Modules/Common/SegmentedViewController/SegmentedViewController.xib
buildPhase: resources
- path: ../Riot/Assets/en.lproj/Vector.strings
Expand Down
1 change: 1 addition & 0 deletions RiotTests/target.yml
Original file line number Diff line number Diff line change
Expand Up @@ -64,3 +64,4 @@ targets:
- path: ../Riot/Managers/Settings/RiotSettings.swift
- path: ../Riot/Managers/EncryptionKeyManager/EncryptionKeyManager.swift
- path: ../Riot/Managers/KeyValueStorage/
- path: ../Riot/PropertyWrappers/UserDefaultsBackedPropertyWrapper.swift
1 change: 1 addition & 0 deletions SiriIntents/target.yml
Original file line number Diff line number Diff line change
Expand Up @@ -48,3 +48,4 @@ targets:
- path: ../Riot/Managers/Settings/RiotSettings.swift
- path: ../Riot/Managers/EncryptionKeyManager/EncryptionKeyManager.swift
- path: ../Riot/Managers/KeyValueStorage
- path: ../Riot/PropertyWrappers/UserDefaultsBackedPropertyWrapper.swift
1 change: 1 addition & 0 deletions changelog.d/pr-4755.misc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Using a property wrapper for UserDefaults backed application settings (RiotSettings).

0 comments on commit c88199a

Please sign in to comment.