[英]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.