问题标签 [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 投票
2 回答
75 浏览

swift - 为什么我的 SwiftUI 视图没有从 @StateObject 的 @Binding 成员获取 onChange 更新?

鉴于我在下面概述的设置,我试图确定为什么ChildView's.onChange(of: _)没有收到更新。

有趣的是,如果我在 中进行以下更改ChildView,我会得到我想要的行为。

  • 更改@StateObject@ObservedObject

  • 更改_viewModel = StateObject(wrappedValue: ViewModel(someItem: someItem))viewModel = ViewModel(someItem: someItem)

据我了解,ChildView's是不合适的viewModel@ObservedObject因为ChildView拥有viewModel@ObservedObject给了我我需要的行为,而@StateObject没有。

以下是我要注意的差异:

  • 使用 时@ObservedObject,我可以点击黑色区域并查看应用于白色文本和红色矩形的更改。ParentView我还可以点击红色矩形并通过白色文本查看观察到的变化。
  • 使用 时@StateObject,我可以点击黑色区域并查看应用于白色文本和红色矩形的更改。问题在于我可以点击此处的红色矩形并查看反映的更改ParentViewChildView无法识别更改(旋转不更改并且未打印“检测到更改”)。

实际上是@ObservedObject正确的,因为ViewModel包含 a@Binding到 a @Statecreated inParentView吗?

0 投票
2 回答
34 浏览

ios - 如何构建一个可以控制其存储属性可变性的 Swift 对象

我想创建一组表现出以下行为的对象:

  1. 每个都有一个 BOOL 属性——称之为dataLocked——最初是错误的。
  2. 每个都有一组存储的属性,其值可以在任何时候设置,但不能读取dataLocked == false
  3. 那些相同的存储属性可以在任何时候被读取,但不能被设置dataLocked == true
  4. dataLocked只能设置一次。

下面是一个示例实现。是否有任何 Swifty 方法来实现这一点,而不必为每个对象的每个属性重现所有这些 get 和 set 条件?

我认为最巧妙的解决方案是创建一个属性包装器,但我还没有找到任何方法让包装器根据封闭对象中的“锁定”属性的值改变其行为。

0 投票
1 回答
43 浏览

ios - 属性包装器:将空更改为可选

我创建了以下扩展:

现在我想让它成为一个属性包装器,这样我就可以像这样使用它:

这个想法是,每当一个空字符串被分配给属性时,它就会被替换为nil.

甚至有可能创建这样一个属性包装器(因为String?String是不同类型的),我将如何去做?

0 投票
1 回答
46 浏览

ios - Swift 5.4+ 中不再编译 Swift 属性包装器?

以下代码曾经适用于 Swift 5.2,也可能适用于 Swift 5.3。(最后一次构建是 2020 年 11 月)

但是,我现在收到一个错误: Property type 'UIKit.UIControl?' does not match 'wrappedValue' type 'UIKit.UIControl?'

有一段时间没有关注属性包装器了,所以我想知道发生了什么变化。

这是使用属性包装器的代码: