Swift 진급노트-업무화 Tips(3)-멋진 UserDefaults
UserDefaults는 사용자의 로그인 상태, 정보 등을 기억하기 위해 경량급 로컬 클라이언트 데이터를 저장할 수 있다.그러나 어떻게 간단하고 우아한 접근 방식을 잃지 않도록 쓸 수 있습니까?이 편에서는 정적 변수로 봉인된 UserDefaults를 구현합니다.결과 및 데모를 먼저 배치합니다.
//
dataLabel.text = CoolUserDefaults.data.value ?? "nil"
//
CoolUserDefaults.data.value = changeDataField.text
상큼하고 쉬워 보이나요?
데모를 먼저 올리고.https://github.com/wiiale/AdvancedSwiftThinker/tree/master/T03-CoolUserDefaults
UserDefaults.gif
쓰기 시 복사
사실 복제란 요소가 일반적인 상황에서 읽기 전용으로 공유되는 것을 가리키며 자원의 복제는 쓰기가 필요할 때만 이루어진다.쓰기 시 복제는 보존값 의미 구조체를 만들 때 바늘처럼 효율적인 조작을 유지할 수 있습니다.
Swift 값 유형을 사용하여 쓰기 시 복제:
import Foundation
struct User {
var id = 1
}
final class Ref {
var value: T
init(_ value: T) {
self.value = value
}
}
struct Box {
private var ref: Ref
init(_ value: T) {
ref = Ref(value)
}
var value: T {
get { return ref.value }
set {
guard isKnownUniquelyReferenced(&ref) else {
ref = Ref(newValue)
return
}
ref.value = newValue
}
}
}
let user = User()
let box = Box(user)
var box2 = box // box、box2 box.ref
box2.value.id = 2 // box2 ref
struct는 하나의 값 형식이기 때문에, 우리가 그것을 다른 변수에 부여할 때, 그 값은 복제되고, 속성ref가 남긴 실례는 두 개의 복사본에 공유됩니다. 인용 형식이기 때문입니다.
guard isKnownUniquelyReferenced(&ref) else {
ref = Ref(newValue)
return
}
이 방법에서 인용이 인용 실례를 공유하는지 확인합니다.
패키지 UserDefaults
그러나 이 글의 중점은 쓸 때 복제하는 것이 아니라 사실 복제할 때 전달하는 사상을 실현하는 데 있다. 봉인하는 것도 번거롭고 복잡하지 않다.
final public class UserDefaultsBox {
public var value: T {
didSet {
setterAction(value)
}
}
public typealias SetterAction = (T) -> Void
var setterAction: SetterAction
public init(_ v: T, setterAction action: @escaping SetterAction) {
value = v
setterAction = action
}
}
UserDefaults와 연결된 액세스 기능이 Box를 캡슐화합니다.
public var value: T {
didSet {
setterAction(value)
}
}
value의 구현은 쓸 때 복사하는 것과 필요할 때 복사하는 것과 같이 값이 부여될 때만 setter 작업을 합니다.
저장할 컨텐츠 구현:
private let dataKey = "userData"
···
final public class CoolUserDefaults {
static let defaults = UserDefaults(suiteName: "cool.user.defaults")!
/// User Data
public static var data: UserDefaultsBox = {
let data = defaults.string(forKey: dataKey)
return UserDefaultsBox(data) { data in
defaults.set(data, forKey: dataKey)
}
}()
···
}
다음에 우리의 정적 변수는 Box 대상입니다.defaults.set 를 set 메서드로 설정합니다.따라서 정적 변수를 표현 형식으로 하는 UserDefaults를 실현했습니다.
사용
// ( )
dataLabel.text = CoolUserDefaults.data.value ?? "nil"
// ( 、 )
CoolUserDefaults.data.value = changeDataField.text
// ( )
CoolUserDefaults.data.value = nil
대량 정리
마지막으로 사용자 정의 CoolUserDefaults에서 대량 캐시를 제거하는 방법을 사용하면 로그인을 종료하는 것처럼 사용자 데이터를 비워야 하는 작업에 사용할 수 있습니다.
final public class CoolUserDefaults {
···
public class func cleanAllUserDefaults() {
do {
data.value = nil
// others ···
}
// reset suite
let dict = defaults.dictionaryRepresentation()
dict.keys.forEach({
defaults.removeObject(forKey: $0)
})
defaults.synchronize()
// reset standardUserDefaults
let standardUserDefaults = UserDefaults.standard
standardUserDefaults.removePersistentDomain(forName: Bundle.main.bundleIdentifier!)
standardUserDefaults.synchronize()
}
}
사용 시 직접 호출
CoolUserDefaults. cleanAllUserDefaults()
하면 됩니다.참고 자료: Use Copy-ON-Write With Swift Value Types YepUserDefaults
기사 요약https://github.com/wiiale/AdvancedSwiftThinker
본 책의 문집에는'단순 수요 제시->단순 실현 수요 부분'을 절차로 하고 내용은 이 지식점이 실현된 업무 실례에 대해서만 익숙하며 업무도 문장 방법보다 더 좋은 실현 방식이 반드시 존재한다. 문장은 지식점을 분석하고 깊이 이해하고자 한다.문집은 기본 지식을 보급하지 않고, 서적의 상세한 내용을 포함하지 않는다.Swift 자세히 배우기 정품 서적 지원(ObjC 중국)
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.