首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SwiftUI中的Mockable @AppStorage

SwiftUI中的Mockable @AppStorage
EN

Stack Overflow用户
提问于 2020-12-29 22:39:39
回答 1查看 66关注 0票数 1

在开发UIKit应用程序时,通过定义一个协议并在UIViewController中注入所需的实现来模拟UserDefaults是非常容易的。

代码语言:javascript
复制
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属性包装器执行以下操作:

代码语言:javascript
复制
@AppStorage("numberOfHandsPlayed") var numberOfHandsPlayed: Int = 3

在SwiftUI中有没有一个干净的解决方案来模拟这个属性包装器,并具有与我的UIKit示例相同的灵活性?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-29 22:46:54

AppStorage允许指定要使用的存储(默认情况下是标准UserDefaults),因此此功能可以用于您的目的。

一种可能的方法是对标准用户默认设置进行子类化,并在以后需要时模拟它。

代码语言:javascript
复制
class MyUserDefaults: UserDefaults {
    // override/add anything needed here
}

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

   // ... other code
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65493916

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档