我最近一直在试验 swift 属性包装器,想知道是否有任何方法可以将它们组合在一起以实现更加模块化的架构。例如:
@WrapperOne @WrapperTwo var foo: T
Run Code Online (Sandbox Code Playgroud)
查看文档一无所获。关于如何做到这一点的唯一参考是在这个 GitHub 页面(https://github.com/apple/swift-evolution/blob/master/proposals/0258-property-wrappers.md)(下面的引用),这似乎在说有可能的。其他文章说他们很难撰写,但没有解释如何去做。但是,我无法理解它,如果有人可以向我展示一些关于如何实现它的示例代码(见帖子底部),我将不胜感激。
当为给定属性提供多个属性包装器时,包装器组合在一起以获得两种效果。例如,考虑的组合物
DelayedMutable和Copying:Run Code Online (Sandbox Code Playgroud)@DelayedMutable @Copying var path: UIBezierPath在这里,我们有一个可以延迟初始化的属性。当我们确实设置了一个值时,它将通过
NSCopying的 copy 方法进行复制。组合是通过将较晚的包装类型嵌套在较早的包装类型中来实现的,其中最内层的嵌套类型是原始属性的类型。对于上面的示例,后备存储将是类型DelayedMutable<Copying<UIBezierPath>>,路径的合成 getter/setter 将查看 .wrappedValue 的两个级别:Run Code Online (Sandbox Code Playgroud)private var _path: DelayedMutable<Copying<UIBezierPath>> = .init() var path: UIBezierPath { get { return _path.wrappedValue.wrappedValue } set { _path.wrappedValue.wrappedValue = newValue } }请注意,这种设计意味着属性包装器组合不是可交换的,因为属性的顺序会影响嵌套的执行方式:@DelayedMutable @Copying var path1: UIBezierPath // _path1 has type DelayedMutable> @Copying @DelayedMutable var path2: UIBezierPath / / 错误:_path2 有格式错误的类型 Copying> 在这种情况下,类型检查器会阻止第二次排序,因为
DelayedMutable不符合NSCopying …