SwiftUI:什么是 @AppStorage 属性包装器

2024-03-14

我曾经使用以下语句将重要的应用程序数据(例如登录凭据)保存到 UserDefaults 中:

UserDefaults.standard.set("[email protected] /cdn-cgi/l/email-protection", forKey: "emailAddress")

现在,我知道 SwiftUI 引入了新的属性包装器,称为:

@应用存储

谁能解释一下新功能是如何工作的?


应用存储

@AppStorage是一种从 UserDefaults 保存和读取变量并以与@State特性。它可以被看作是一个@State自动保存(和读取)的属性UserDefaults.

你可以考虑以下几点:

@AppStorage("emailAddress") var emailAddress: String = "[email protected] /cdn-cgi/l/email-protection"

相当于这个(即notSwiftUI 中允许并且将not编译):

@State var emailAddress: String = "[email protected] /cdn-cgi/l/email-protection" {
    get {
        UserDefaults.standard.string(forKey: "emailAddress")
    }
    set {
        UserDefaults.standard.set(newValue, forKey: "emailAddress")
    }
}

注意@AppStorage行为就像@State:对其值的更改将使视图无效并重新绘制。

默认情况下@AppStorage将使用UserDefaults.standard。但是,您可以指定自己的UserDefaults store:

@AppStorage("emailAddress", store: UserDefaults(...)) ...

不支持的类型(例如,Array):

正如 iOSDevil 中提到的answer https://stackoverflow.com/a/62849282/8697793, AppStorage目前用途有限:

您可以在 @AppStorage 中使用的类型(当前)仅限于:Bool、Int、Double、String、URL、Data

如果您想使用任何其他类型(例如Array),您可以添加一致性RawRepresentable:

extension Array: RawRepresentable where Element: Codable {
    public init?(rawValue: String) {
        guard let data = rawValue.data(using: .utf8),
              let result = try? JSONDecoder().decode([Element].self, from: data)
        else {
            return nil
        }
        self = result
    }

    public var rawValue: String {
        guard let data = try? JSONEncoder().encode(self),
              let result = String(data: data, encoding: .utf8)
        else {
            return "[]"
        }
        return result
    }
}

Demo:

struct ContentView: View {
    @AppStorage("itemsInt") var itemsInt = [1, 2, 3]
    @AppStorage("itemsBool") var itemsBool = [true, false, true]

    var body: some View {
        VStack {
            Text("itemsInt: \(String(describing: itemsInt))")
            Text("itemsBool: \(String(describing: itemsBool))")
            Button("Add item") {
                itemsInt.append(Int.random(in: 1...10))
                itemsBool.append(Int.random(in: 1...10).isMultiple(of: 2))
            }
        }
    }
}

有用的链接:

  • 什么是 @AppStorage 属性包装器? https://www.hackingwithswift.com/quick-start/swiftui/what-is-the-appstorage-property-wrapper
  • AppStorage 属性包装器 SwiftUI https://medium.com/@ruchish7187/appstorage-property-wrapper-swiftui-c4ceba7ff5e7
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SwiftUI:什么是 @AppStorage 属性包装器 的相关文章

随机推荐

  • Automapper 地图自定义集合

    Hello 我有一个看起来像这样的列表 public class PagedList
  • 在 PHP 和 JavaScript 之间共享常量 [重复]

    这个问题在这里已经有答案了 可能的重复 将 PHP 字符串传递给 Javascript 变量 并转义换行符 https stackoverflow com questions 168214 pass a php string to a ja
  • 确保立即选择 iframe

    这可能是一个愚蠢的问题 但是当我使用 iframe 时 如果您单击该框架 则可以使用特定方面 由 iframe 使用的 html 文件中的事件侦听器控制 如果您在 iframe 外部单击 则会失去对这些控件和事件侦听器的访问权限 有没有办法
  • PHP 重写 url 并保留发布的数据

    我有一个 php 服务器 我想重写传入的 url 由于传入请求是发布请求 我还希望发布的数据在新的网址上传输 我已经成功地使用以下重写规则重定向网址 RewriteRule test http localhost index php dat
  • Android:将 RGB888 转换为 Y800

    我正在从 vuforia 获取作为 RGB888 bytes 捕获的图像 我想将其传递给 zbar 它期望格式为 Y800 我怎样才能做到这一点 i tried Image barcode new Image width height RG
  • useReducer 的initialState 类型为never?

    初始状态有错误 类型为 email string 的参数密码 字符串 有效 布尔值 不可分配给 never 类型的参数 ts 2345 function reducer state IState action IFluxAction con
  • 将 Selenium WebDriver 与 Tor 结合使用

    因为 Tor Browser Bundle 只是 Firefox 的补丁版本 所以似乎应该可以使用FirefoxDriver使用 Tor 浏览器 这是我到目前为止所尝试过的 String torPath C Users My User De
  • 类路径中的 Groovy 资源未加载

    今天是个好日子 我正在使用 spock 框架在我的 groovy 项目 IDE Intellij Idea 12 6 中进行测试 我的 spock 规范类将文件名传递给 groovy 对象进行处理 该文件肯定位于类路径中 但是当我尝试以这种
  • 如何用Java编写全屏模式?

    我希望我的应用程序具有全屏模式 最简单的方法是什么 我是否需要第三方库来实现此目的 或者 JDK 中是否已经提供了此功能 Try the 全屏独占模式API http java sun com docs books tutorial ext
  • 即使我在组件中添加了提供程序,角度 2 中也没有响应提供程序?

    错误 这是我收到的错误 即使我已将提供程序添加到我的组件中 我无法获取我的错误是什么 这是我的所有文件 应用程序组件 ts 应用程序组件 html carservice ts 我无法解决 EXCEPTION Error in 0 0 ORI
  • 在批次之间传递 LSTM 状态的最佳方式

    我正在尝试找到在批次之间传递 LSTM 状态的最佳方法 我已经搜索了所有内容 但找不到当前实施的解决方案 想象一下我有类似的东西 cells rnn LSTMCell size for size in 256 256 cells rnn M
  • 在 Linux C 控制台应用程序中模拟按键

    有没有办法用C语言在Linux中模拟按键 在我的具体情况下 我使用的是 Ubuntu 9 04 需要一个简单的应用程序 在启动时调用 暂停 按钮 这将使 Firefox 中的 iframe 使用 Javascript 进行刷新 我假设你的意
  • 使用 Python-oauth2 在 python 中为 tumblr API 初始化 Oauth 客户端

    我是 Oauth 的新手 过去 对于用 Python 编写的 Twitter 应用程序 我使用 python oauth2 库来初始化客户端 如下所示 consumer oauth Consumer key CONSUMER KEY sec
  • 如何在 React 中拖放多个元素?

    这是我在 StackOverflow 上的第一个问题 我想用 React 构建一个小游戏 用户可以将四块骨牌拖放到网格上 也可以根据自己的喜好重新定位或旋转它们 四格骨牌由矩阵表示 然后每个块都在 li 元素中渲染 z tetromino
  • 从 html select 中选择的总和

    尝试了多种方法 进行了大量研究 也许我错过了一些东西但无法完成 所以 我想知道是否可以对 html select 的选定值求和 这是我的代码
  • 使用express在node.js中进行本地化[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 您使用哪个包在 Node js 中使用 Express 进行本地化 Thanks 节点本地化 http
  • 为什么仅在 CNN 中对通道进行批量归一化

    我想知道 在卷积神经网络中 批量归一化是否应该分别应用于每个像素 或者我应该取每个通道的像素平均值 我在Tensorflow的描述中看到了这一点tf layers batch normalization https www tensorfl
  • Visual Studio 2017 HRESULT:0x80004004

    我在 Docker 容器中完美地运行了 ASP NET Core 项目 但随后我在同一解决方案中创建了另一个项目 该项目被第一个项目引用 构建时 VS 2017 没有抱怨 调试时VS说 操作已中止 HRESULT 异常 0x80004004
  • rtl HTML 页面中的方向 ltr

    我试图在 rtl HTML 页面中显示负数 该标签似乎没有回应我的direction ltr 我写了一个jsFiddle http jsfiddle net opmaster rWSXX 1 显示相反的场景 尝试从右到左显示 Add uni
  • SwiftUI:什么是 @AppStorage 属性包装器

    我曾经使用以下语句将重要的应用程序数据 例如登录凭据 保存到 UserDefaults 中 UserDefaults standard set email protected cdn cgi l email protection forKe