簡體   English   中英

SwiftUI 中的可模擬@AppStorage

[英]Mockable @AppStorage in SwiftUI

在開發 UIKit 應用程序時,很容易通過定義協議並在UIViewController UserDefaults

protocol Defaults {
    var numberOfHandsPlayed: Int { get set }
}

struct AppDefaults: Defaults {
    static let shared = AppDefaults()
    private let userDefaults = UserDefaults.standard

    struct Keys {
        private init() {}
        static let numberOfHandsPlayed = "numberOfHandsPlayed"
    }


    var numberOfHandsPlayed: Int {
        get {
            userDefaults.integer(forKey: Keys.numberOfHandsPlayed)
        }
        set(numberOfHandsPlayed) {
            userDefaults.setValue(numberOfHandsPlayed, forKey: Keys.numberOfHandsPlayed)
        }
    }
}

struct MockDefaults: Defaults {
    var numberOfHandsPlayed: Int {
    get {
        // mocking behaviour
    }
    set(numberOfHandsPlayed) {
        // mocking behaviour
    }
}

class PracticeViewController: UIViewController {
    private var defaults: Defaults?
    // defaults can be set to MockDefaults or AppDefaults
}

但現在有了 SwiftUI,我可以使用@AppStorage屬性包裝器執行以下操作:

@AppStorage("numberOfHandsPlayed") var numberOfHandsPlayed: Int = 3

SwiftUI 中是否有一個干凈的解決方案來模擬此屬性包裝器並具有與我的 UIKit 示例相同的靈活性?

AppStorage允許指定要使用的存儲(默認為標准UserDefaults ),因此可以將此功能用於您的目的。

一種可能的方法是對標准用戶默認值進行子類化,然后在需要時/在需要時對其進行模擬。

class MyUserDefaults: UserDefaults {
    // override/add anything needed here
}

struct DemoView: View {
    @AppStorage("numberOfHandsPlayed", store: MyUserDefaults()) var numberOfHandsPlayed: Int = 3

   // ... other code

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM