问题标签 [property-wrapper]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1082 浏览

swift - 被包装对象的访问名称,在 Swift 属性包装器实现中

我正在使用 Swift 属性包装器来定义如下内容:

在属性包装器的实现中,我想以字符串的形式访问变量 foo 的名称。像这样的东西:

建议?

0 投票
3 回答
234 浏览

swift - 多个文件中带有 Codable 的属性包装器的 Swift 编译错误

对于在多个文件中可编码的属性包装器,编译失败。

我在下面的 Swift 源代码中找到了测试代码:

并在我的测试项目中使用它们:

测试项目

但是编译失败并出现错误:

如何解决?

0 投票
1 回答
1836 浏览

swift - Property Wrapper @Lazy 变量线程安全吗?

我们现在有了一种创建惰性变量的新方法。它在swift-evolution/proposals/0258-property-wrappers.md中有描述:

它是线程安全的实现吗?如果不是,如何重现非线程安全行为?

0 投票
1 回答
588 浏览

ios - 如何检测类型对于通用 propertyWrapper 是可选的

我正在为UserDefaults.

我想要实现的是:

  • 将非零值设置为属性会将其存储在用户默认值中。
  • 设置 nil 将从 UserDefault 中删除对象。

但是下面的代码会引发编译器错误

条件绑定的初始化程序必须具有可选类型,而不是“T”

有什么方法可以识别 T 是可选的吗?因为我可以从 UserDefaults 中删除密钥。如果不是如何达到预期的输出?

0 投票
1 回答
657 浏览

swift - 使用 Swift @propertyWrapper 作为动态默认值?

我需要一个 Swift 属性——如果该值尚未设置——默认为另一个值。

可以使用后备存储私有属性来实现。例如,对于num应该默认为 global的属性defaultNum,它的工作方式如下:

这行得通,但是对于我们代码中的一个常见模式,每个这样的属性都有很多样板文件。

使用 Swift 属性包装器,是否可以更简洁地做到这一点?


什么行不通_

请注意,因为我们希望默认值是动态的,所以静态初始化器将不起作用。例如:

0 投票
4 回答
4643 浏览

swift - 为计算属性添加 @Published 行为

我正在尝试制作一个ObservableObject具有包装UserDefaults变量的属性。

为了符合ObservableObject,我需要用 包装属性@Published。不幸的是,我不能将其应用于计算属性,就像我用于UserDefaults值一样。

我怎样才能让它工作?我必须做什么才能实现@Published行为?

0 投票
1 回答
805 浏览

ios - 无法在 Swift 中跨模块访问属性包装器

在我的Common模块(框架项目)中有以下用户默认值的属性包装器

在我的App模块(主项目)中,我声明要使用的客户端MyUserDefaultWrapper

并使用类似,

它产生构建错误。

未知属性“MyUserDefaultWrapper”

如何摆脱这个问题?

0 投票
1 回答
4912 浏览

binding - SwiftUI 我可以使用 Binding 和 @Binding 属性包装器设置自定义绑定吗?

如何在 SwiftUI 视图上使用Binding(get: { }, set: { })带有属性的自定义绑定。@Binding我已经成功地将这个自定义绑定与@State变量一起使用,但不知道如何@Binding在子视图初始化程序中应用它。我需要它来观察@Binding父类分配给属性的更改,以便执行具有一些副作用的代码!

0 投票
1 回答
199 浏览

ios - 使用 PropertyWrapper 时的同时访问

我想创建一个property wrapper,它会存储 a callback block,并在每次它的值发生变化时执行它。简单的东西KVO。它工作正常,但有一个问题。如果我在此回调块中使用属性本身,则会收到错误消息:

据我了解,这是因为属性本​​身仍在被写入,而该块正在执行,这就是它无法读取的原因。

让我们添加一些代码来说明我的意思:

并且AppDelegate

我有一些解决方法,但由于各种原因,没有一个主题是我真正需要的。

  1. 如果我改为block从 this中访问值block argument,并在 value 中传递此参数didSet,那么它可以正常工作。但这迫使我总是以这种方式使用它,我想将它与包含各种其他回调的代码一起使用,有时我也能够直接访问这个值会更方便。

  2. 我可以callback block异步执行(DispachQueue.main.async { self.block?(value) })。但这对我来说也不是最好的。

  3. 改为使用combine。我可能会,但我也想暂时保留这个功能。我也只是对这个问题感到好奇。

这可以以某种方式克服吗?什么变量实际上导致了这个read-write访问错误?这是内部的值propertyWrapper还是propertyWrapper本身的结构?我认为是propertyWrapper struct访问导致了这种情况,而不是它的内部价值,但我不确定。

0 投票
2 回答
785 浏览

swift - 更新 View Swift 的自定义属性包装器

Xcode 11.3,斯威夫特 5.1.3

我目前正在尝试创建一个自定义属性包装器,它允许我将变量链接到 Firebase 数据库。这样做时,为了更新视图,我首先尝试使用@ObservedObject @Bar var foo = []. 但是我收到一个错误,即不支持多个属性包装器。接下来我尝试做的事情,老实说是理想的,是尝试让我的自定义属性包装器在更改时更新视图本身,就像@Stateand一样@ObservedObject。这既避免了需要向下两层访问底层值,又避免了使用嵌套属性包装器。为此,我检查了 SwiftUI 文档,发现它们都实现了该DynamicProperty协议。我也尝试使用它但失败了,因为我需要能够更新视图(调用update()) 来自我的 Firebase 数据库观察者,我不能这样做,因为.update()它正在变异。

这是我目前的尝试:

使用示例:

但是,当我尝试使用它时,即使我肯定.childAdded正在调用观察者,视图也不会使用 Firebase 的值进行更新。


我解决此问题的一个尝试是将所有这些变量存储在一个本身符合ObservableObject. 这个解决方案也是理想的,因为它允许在我的应用程序中共享被观察的变量,防止同一日期的多个实例并允许单一的事实来源。不幸的是,这也没有使用获取的值更新视图currentValue


有没有办法制作一个自定义属性包装器,它也会更新 SwiftUI 中的视图?