问题标签 [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 回答
245 浏览

swift - 在自动合成的 init 方法中使用非默认参数参数化 @PropertyWrapper?

v1。无参数:✅ 按预期工作

通常,我可以像这样创建一个Trimmed 包装器

title请注意,对于没有默认值的参数(例如)和具有默认值的参数(例如 ),它是如何完美运行的body


v2。一个参数:❌不编译

现在想象一下我不想硬编码.whitespacesAndNewlines,而是允许实现者提供这个值:

我遇到的第一个问题是,title没有默认值的参数无法编译。它要求我添加wrappedValue值。


v3。提供默认属性值:⚠️ 消费者可以省略参数

修复此编译器错误的最简单方法是给它一个默认值,如下所示body

但是,现在我失去了强制消费者title通过自动合成的构造函数提供值的能力。


v4。供应默认wrappedValue:⚠️ PropertyWrapper 暴露给消费者

如果我不提供默认值,而是遵守原始错误消息并提供wrappedValue,title现在再次需要,但它有更大的问题。

更大的问题是 Trimmed 现在向消费者公开,因此他们不能简单地提供 String 值,更糟糕的是,他们可以改变结构的行为(例如,通过提供不同的characterSet)。


v5。提供自定义 init:⚠️ 不再获得自动合成的 init

解决所有这些问题的一种方法是不依赖自动合成的 init,而是提供我们自己的。要解决 v2 中的语法错误,这还需要为title. 这可以通过与body(例如var title: String = "")相同的方式来完成,或者通过向 Trimmed.wrappedValue 添加默认值来完成。两者在功能上是等效的。

但是,我想知道参数化的 PropertyWrapper + 没有默认参数 + 自动合成的构造函数是否可以很好地协同工作。


如果我有一个参数化的 PropertyWrapper,我如何强制消费者在其自动合成的构造函数中为其提供一个值?

(例如,我如何让 v2 ​​编译而不会产生不必要的副作用?)


注意:最初的问题是关于让参数化值的默认属性值按预期工作,但经过一些研究,似乎根本问题是上面提到的问题。因此问题被简化了。

0 投票
1 回答
257 浏览

swift - Swift @ObservedObject 用另一个属性初始化

编辑添加了显示变量声明的源代码

我正在尝试初始化一个视图模型属性,它是一个 @ObservedObject @ObservedObject private var viewmodel : ExpenseListViewModel

我想使用存储库初始化视图模型,该存储库将接受 ManagedObjectContext 作为构造函数中的参数

由于 viewmodel 有一个 prperty 包装器,因此也不允许将其创建为计算属性。

当我尝试在 init 中初始化存储库和视图模型时,我在初始化之前使用了一个 self

0 投票
1 回答
290 浏览

swift - @AppStorage 属性包装器无法使用 VoiceOver 进行切换

我正在尝试在 iOS 14 @AppStorage 中使用新的 @property 包装器。如果我在切换中使用它,它似乎无法使用 VoiceOver 切换。正常的 @State 私有 var 属性可以正常工作。我可以确认这些在 VoiceOver 未打开的情况下有效。

  1. 这是一个我可以自己解决的可访问性问题吗?
  2. 这是Apple需要修复的iOS14错误吗?

下面的代码:

0 投票
1 回答
2495 浏览

swiftui - @EnvironmentObject 和 @ObservedObject 有什么区别?

我一直在阅读 SwiftUI 中的属性包装器,我发现它们做得很好,但我真正不明白的一件事是@EnvironmentObject@ObservedObject之间的区别。

从我目前学到的知识来看,当我们在应用程序的各个地方都需要一个对象但我们不需要将它传递给所有这些对象时,我看到使用@EnvironmentObject 。例如,如果我们有层次结构 A -> B -> C -> D 并且对象是在 A 处创建的,它会保存在环境中,以便我们可以将它直接从 A 传递给 D,如果 D 需要它。

如果我们使用在 A 处创建并需要传递给 D 的@ObservedObject ,那么我们也需要经过 B 和 C。

但我仍然不知道如何决定使用哪一个。以下是我制作的 2 个示例项目:

两个代码都对视图进行相同的更新。两个 ContentView 也都传递一个Order对象。不同之处在于 Environment 传递 .environmentObject(order)而 Observed 直接传递EditView(order: order)。对我来说,两者都做同样的工作,只是他们的声明不同,因此我希望得到一些解释或更好的例子。

0 投票
1 回答
263 浏览

swift - 在 Swift 属性包装器中公开字典

我有一个不想向用户公开的内部字典。相反,我只使用属性公开某些值,如下所示:

可以想象,这最终会重复很多次。我在想属性包装器将是清理它的好方法 - 但是,不可能items直接传递给包装器,因为属性包装器是之前创建的init(因此self无法访问)。

有没有办法解决这个问题,或者这只是 propertyWrappers 的限制之一?

0 投票
1 回答
673 浏览

ios - 在 swiftui 中使用 @Binding 和类型转换

我的数据模型:

在我的视图代码中,我想将 aabbData 的元素向下转换为 AbData 类型,并将其 x 属性绑定到控件的值。所以我尝试编写代码:

代码不起作用。如何将向下转换值的属性绑定到控件的值?

0 投票
2 回答
197 浏览

ios - 自定义属性包装器无法准确反映我在 SwiftUI 中的 TextField 的状态,知道为什么吗?

我创建了一个属性包装器,我想在其中插入一些逻辑,并且“set”值正在做正确的事情,但文本字段并未使用所有大写文本进行更新。文本字段不应该显示所有大写文本还是我误解了它是如何工作的?

这也是一个人为的例子,我的最终目标是在属性包装器中插入更多的逻辑,我只是​​使用大写的例子来让它工作。我在互联网上搜索了所有内容,但没有找到可行的解决方案。

0 投票
1 回答
450 浏览

swift - 如何防止 SwiftUI 像使用 @StateObject 一样重新初始化我的包装属性?

从我在视图中自己实例化对象时所读到的内容中,您应该使用@StateObject而不是@ObservedObject. 因为显然,如果您使用@ObservedObjectSwiftUI,SwiftUI 可能会随时决定将其丢弃并稍后重新创建它,这对于某些对象来说可能会很昂贵。但是如果你改用@StateObject它,那么显然 SwiftUI 知道不要把它扔掉。

我理解正确吗?

我的问题是,如何将其@StateObject传达给 SwiftUI?我问的原因是因为我制作了自己的 propertyWrapper,它将视图的属性连接到 firebase firestore 集合,然后开始监听实时快照。这是一个看起来像的例子:

内部的闭包@Collection是可选的,但可用于为集合构建更精确的查询。

现在这很好用。代码很有表现力,我得到了很好的实时更新数据。您可以看到,当用户单击房间标题时,导航视图将导航到该聊天室。聊天室是显示该房间中所有消息的视图。这是该代码的简化视图:

但我注意到,每次用户以任何方式与 UI 交互时,SwiftUI 都会初始化一个新的消息集合。就像即使单击输入框以使其获得焦点一样。这是一个巨大的内存泄漏。我不明白为什么会发生这种情况,但是有没有办法告诉 SwiftUI 只初始化@Collection一次,就像它一样@StateObject

0 投票
1 回答
403 浏览

swift - 如何在 propertyWrapped UserDefault 中集成枚举

下面的结构将适用于原始数据类型,例如Int, String,Double等,有没有办法让这个适用于枚举,这样我就不必使用 rawValues 手动解析?

目前我的解决方法是将对象包装在另一个 getter 和 setter 中,这样的枚举。

我试图为RawRepresentable类型创建一个不同的属性包装器,但 Swift 无法从中推断出类型T

即使只有少数几个,为代码库中的每个可存储枚举创建包装器类型也不是理想的

有什么我遗漏的或者这是 Swift 的当前限制吗?

0 投票
1 回答
187 浏览

swift - 如何使自定义属性包装器可绑定,可能使用@State?

我创建了一个自定义属性包装器,它作为它的 setter 和 getter 从文件中写入和读取。

我现在想在设置视图中使用它,如下所示:

我收到以下错误:

我怎样才能实现写入和读取文件以设置和获取变量的这种效果,同时还允许它绑定到一个值?

注意:我的项目不需要是“App Store Legal”