Swift 진급노트-업무화 Tips(3)-멋진 UserDefaults

4271 단어
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 중국)

좋은 웹페이지 즐겨찾기