问题标签 [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.
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
,我可以点击黑色区域并查看应用于白色文本和红色矩形的更改。问题在于我可以点击此处的红色矩形并查看反映的更改ParentView
但ChildView
无法识别更改(旋转不更改并且未打印“检测到更改”)。
实际上是@ObservedObject
正确的,因为ViewModel
包含 a@Binding
到 a @State
created inParentView
吗?
ios - 如何构建一个可以控制其存储属性可变性的 Swift 对象
我想创建一组表现出以下行为的对象:
- 每个都有一个 BOOL 属性——称之为
dataLocked
——最初是错误的。 - 每个都有一组存储的属性,其值可以在任何时候设置,但不能读取
dataLocked == false
。 - 那些相同的存储属性可以在任何时候被读取,但不能被设置
dataLocked == true
dataLocked
只能设置一次。
下面是一个示例实现。是否有任何 Swifty 方法来实现这一点,而不必为每个对象的每个属性重现所有这些 get 和 set 条件?
我认为最巧妙的解决方案是创建一个属性包装器,但我还没有找到任何方法让包装器根据封闭对象中的“锁定”属性的值改变其行为。
ios - 属性包装器:将空更改为可选
我创建了以下扩展:
现在我想让它成为一个属性包装器,这样我就可以像这样使用它:
这个想法是,每当一个空字符串被分配给属性时,它就会被替换为nil
.
甚至有可能创建这样一个属性包装器(因为String?
和String
是不同类型的),我将如何去做?
ios - Swift 5.4+ 中不再编译 Swift 属性包装器?
以下代码曾经适用于 Swift 5.2,也可能适用于 Swift 5.3。(最后一次构建是 2020 年 11 月)
但是,我现在收到一个错误:
Property type 'UIKit.UIControl?' does not match 'wrappedValue' type 'UIKit.UIControl?'
有一段时间没有关注属性包装器了,所以我想知道发生了什么变化。
这是使用属性包装器的代码: