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

swift5.1 - 如果从其他文件访问,则属性包装值给出非可选类型

这是我创建的用于将数据保存到 UserDefault 的 PropertyWrapper,如果在我编写 PropertyWrapper 代码的文件中使用该值,这符合我的期望,可以使用可选链接。

但这给出了一个错误,条件绑定的初始化程序必须具有可选类型,而不是“用户”,当在另一个文件中使用时,如下所示

但是,如果在同一个文件中使用相同的内容,它可以与可选链接一起正常工作。

0 投票
1 回答
1367 浏览

ios - UserDefault 属性包装器不保存值 iOS 版本低于 iOS 13

我正在使用属性包装器来保存我的用户默认值。在 iOS 13 设备上,此解决方案效果很好。但是在 iOS 11 和 iOS 12 上,这些值不会保存到用户默认值中。我读到属性包装器是向后兼容的,所以我不知道为什么这在旧 iOS 版本上不起作用。

这是属性包装器:

然后我可以像这样设置值:

我是否使用了错误的属性包装器?是否还有其他人在旧 iOS 版本上遇到属性包装器问题?

0 投票
1 回答
3378 浏览

swift - Swift - 如何从视图之外的 func 访问@Published var?

我试图从视图中删除逻辑,同时保留 SwiftUI 的好处。想法 1 有效,但它使用的变量比我想要的要多。想法 2 给出错误:本地属性尚不支持属性包装器。视图应该返回“bar”。完成这项工作的最佳方法是什么?非常感谢。

0 投票
4 回答
1966 浏览

swift - 期望 SwiftUI DynamicProperty 属性包装器的内部更新来触发视图更新是否正确?

我正在尝试创建 SwiftUI 支持的自定义属性包装器,这意味着对相应属性值的更改将导致 SwiftUI 视图的更新。这是我所拥有的简化版本:

我看到即使 myObservedObject包含在我的自定义属性包装器中,只要满足以下条件,SwiftUI 仍然会捕获更改SomeObservedObject

  • 我的属性包装器是一个结构
  • 我的属性包装器符合DynamicProperty

不幸的是,文档很少,我很难判断这是否仅适用于当前的 SwiftUI 实现。

(在 Xcode 中,而不是在线)的文档DynamicProperty似乎表明这样的属性是从外部更改的属性,导致视图重绘,但是不能保证当您使自己的类型符合该协议时会发生什么。

我可以期望这在未来的 SwiftUI 版本中继续工作吗?

0 投票
2 回答
2612 浏览

swift - 如何编写 swift 属性包装器?

我最近一直在尝试使用 swift 属性包装器,想知道是否有任何方法可以将它们组合在一起以实现更加模块化的架构。例如:

浏览文档一无所获。如何做到这一点的唯一参考是在这个 GitHub 页面(https://github.com/apple/swift-evolution/blob/master/proposals/0258-property-wrappers.md)(下面的引用),这似乎说有可能的。其他文章说它们很难编写,但没有解释如何去做。但是,我无法对它做出正面或反面,如果有人可以向我展示一些关于如何实现它的示例代码(见帖子底部),我将不胜感激。

当为给定属性提供多个属性包装器时,包装器组合在一起以获得两种效果。例如,考虑 和 的DelayedMutable组成Copying

在这里,我们有一个属性,我们可以将初始化延迟到以后。当我们确实设置了一个值时,它将通过NSCopying的复制方法进行复制。组合是通过将后面的包装器类型嵌套在较早的包装器类型中来实现的,其中最内层的嵌套类型是原始属性的类型。对于上面的示例,后备存储将是类型 DelayedMutable<Copying<UIBezierPath>> ,并且路径的合成 getter/setter 将查看 .wrappedValue 的两个级别:

请注意,这种设计意味着属性包装器组合不是可交换的,因为属性的顺序会影响嵌套的执行方式: @DelayedMutable @Copying var path1: UIBezierPath // _path1 的类型为 DelayedMutable> @Copying @DelayedMutable var path2: UIBezierPath / /error: _path2 has ill-formed type Copying> 在这种情况下,类型检查器会阻止二次排序,因为DelayedMutable不符合NSCopying协议。情况并非总是如此:一些语义不好的组合不一定会被类型系统捕获。在“考虑的替代方案”中介绍了这种组合方法的替代方案。

理想情况下,我想实现以下内容:

这样就可以实现:

我知道这个例子是实现属性包装器组合的一个有点愚蠢的理由,但这只是为了在学习新功能时简单起见。

任何帮助将不胜感激。

0 投票
1 回答
464 浏览

swift - Swift 5.1 中的 Property Wrapper 编译错误

我正在弄清楚 Swift 中的属性包装器,但我似乎错过了一些东西。

这就是我为我们使用的依赖注入框架编写属性包装器的方式:

但是当我在下面的类中使用它时,会出现编译错误。我看过很多例子,对我来说做完全相同的事情,但可能存在一些差异。

几天前,我遇到了 Xcode 在通用属性包装器方面存在编译问题的参考资料,但我再也找不到它了。我不确定这是否相关,但也许有人可以帮助我。

使用 Xcode 11.3.1

根据要求,特此声明(操场上的一个文件):

0 投票
1 回答
571 浏览

ios - 去抖属性包装器

在花了一些时间创建 @Debounced 属性包装器之后,我对代码的可读性不满意。要了解发生了什么,您确实需要了解属性包装器的工作原理以及包装值和投影值的概念。这是属性包装器:

属性包装器的使用方式如下:

它可以正常工作。每次设置 text 属性时,都会调用 print 函数。如果值在 0.4 秒内多次更新,则该函数只会被调用一次。

但就简单性和可读性而言,我认为最好像这样创建一个 Debouncer 类:https ://github.com/webadnan/swift-debouncer 。

你怎么看?有没有更好的方法来创建这个属性包装器?

0 投票
1 回答
963 浏览

swift - 如何实现一个自定义属性包装器,它将发布 SwiftUI 的更改以重新呈现它的视图

尝试实现一个自定义属性包装器,它也会以同样的方式发布其更改@Publish。例如,允许我的 SwiftUI 使用我的自定义包装器接收我的属性的更改。

我拥有的工作代码:

但是,我不喜欢调用类objectWillChange.send()中的每个属性MySettings

包装器@Published运行良好,因此我尝试将其作为 的一部分来实现@MyWrapper,但没有成功。

我发现的一个很好的灵感是https://github.com/broadwaylamb/OpenCombine,但即使尝试使用那里的代码我也失败了。

在努力实现的过程中,我意识到为了开始@MyWrapper工作,我需要准确地了解如何@EnvironmentObject@ObservedObject订阅@Published.

任何帮助,将不胜感激。

0 投票
1 回答
121 浏览

state - 如何从嵌套视图更改@State 属性包装器

我想知道我应该如何在下面的视图中更改@State 属性包装器 showErrorAlert

来自 DocumentPicker 结构代码,以防读取所选文件失败。

我的意思是如何将属性包装器值设置为 true 以显示警报。我应该改用@ObservedObject 还是@EnvironmentObject?谢谢。

0 投票
2 回答
806 浏览

ios - ForEach NavigationLink 与状态和绑定

我正在尝试使用 NavigationLink 生成 ForEach 并使用 State 和 Binding 来传递一些实体:

然后是以下视图:

问题是我无法将值传递给详细信息视图,因为错误:

这里有什么问题以及如何解决这个问题?

如果我只有一个简单@State的通过绑定传递它没问题,但我想/需要在 ForEach 中使用它FetchedResults

编辑:如果我删除$我得到Cannot convert value of type 'MyEntity' to expected argument type 'Binding<MyEntity>'

EDIT2:目的是将一些对象传递给DetailView,然后再将其传递回ContentView