[iOS] UserDefaults와 SubScript의 운명적 만남의 후속편임.
리팩토링하기 싫어서 빈둥거리다가 리팩토링 과제가 주어져서 생각난김에 게시물에서 제시해본 대로 리팩토링을 한번 해보았음.
extension UserDefaults {
enum BoolUserDefaultsKeys: String, CaseIterable {
case isFirstStart
}
enum StringArrayUserDefaultsKeys: String, CaseIterable {
case searchHistory
case likeList
}
enum StringUserDefaultsKeys: String, CaseIterable {
case userProfile
case userNickname
}
subscript(item: BoolUserDefaultsKeys) -> Bool {
get {
return UserDefaults.standard.bool(forKey: item.rawValue)
} set {
UserDefaults.standard.setValue(newValue, forKey: item.rawValue)
}
}
subscript(item: StringUserDefaultsKeys) -> String {
get {
return UserDefaults.standard.string(forKey: item.rawValue) ?? ""
} set {
UserDefaults.standard.setValue(newValue, forKey: item.rawValue)
}
}
subscript(item: StringArrayUserDefaultsKeys) -> [String] {
get {
return (UserDefaults.standard.array(forKey: item.rawValue) ?? []) as! [String]
} set {
UserDefaults.standard.setValue(newValue, forKey: item.rawValue)
}
}
static func resetUserDefaults() {
for item in BoolUserDefaultsKeys.allCases {
UserDefaults.standard.removeObject(forKey: item.rawValue)
}
}
static func resetSearchHistory() {
UserDefaults.standard.removeObject(forKey: StringArrayUserDefaultsKeys.searchHistory.rawValue)
}
static func deleteSearchHistroy(_ index: Int) {
var data = UserDefaults.standard[.searchHistory]
data.remove(at: index)
UserDefaults.standard[.searchHistory] = data
}
static func isStuffInList(_ id: String) -> String {
let lists: [String] = UserDefaults.standard[.likeList]
for list in lists where list == id {
return "heart.fill"
}
return "heart"
}
static func likeToggle(_ id: String) {
var lists: [String] = UserDefaults.standard[.likeList]
for list in lists where id == list {
UserDefaults.standard[.likeList] = lists.filter( { $0 != id })
return
}
lists.insert(id,at:0)
UserDefaults.standard[.likeList] = lists
return
}
}
의도한대로 매우 잘 작동한다 굿굿