探索 Swift:深入了解属性包装器

属性包装器在 Swift 5.1 中引入,旨在简化通用编程模式的重用,但此后它们的功能不断扩展,可以与本地上下文、函数和闭包参数等配合使用。我们很幸运社区中有许多创作者使用属性包装器开发应用并撰写相关经验,我们想在此与大家分享一些我们最喜欢的文章。

Erica Sadun 在舞台上就属性包装器发表演讲她在 dotSwift 2020 上关于属性包装器的演讲 中,Erica Sadun 向我们讲解了为什么属性包装器可以帮助我们在声明点而不是使用点指定行为约定。Erica 一直是 Swift 演进过程中最积极的参与者之一——我们非常感谢她的工作!另一个精彩的演讲来自 Stewart Lynch,他演示了在使用属性包装器时,包装值和投影值都非常有用,并详细展示了如何在 UIKit 和 SwiftUI 中使用它们——你可以在这里找到它

我们也有很多关于这个主题的精彩文章:Sarun Wongpatcharapakorn 展示了 如何初始化属性包装器 以及投影值的工作原理,你可以阅读 Antoine van der Lee 关于 属性包装器如何通过用自定义属性包装器替换重复工作来消除样板代码 的建议,以及 Rudrank Riyam 带我们了解 创建一个包装器来跟踪设备方向——你可以真正看到属性包装器在简化代码方面的效率。

如果你想更进一步,你会喜欢 Donny Wals 的这篇文章,他在文章中分享了他关于使用 DynamicProperty 协议 为 SwiftUI 编写自定义属性包装器 的知识。如果你遵循 Donny 的指南,你将看到属性包装器如何让我们获得如此简洁的代码

struct ContentView: View {
    @Setting(\.onboardingCompleted) var didOnboard

    var body: some View {
        Text("Onboarding completed: \(didOnboard ? "Yes" : "No")")

        Button("Complete onboarding") {
            didOnboard = true
        }
    }
}

还有许多软件包可用于支持我们项目中的属性包装器,包括 ValidatedPropertyKit,来自 Sven Tiigi,它可以检查字符串是否与特定正则表达式匹配,序列是否具有特定数量的元素,以及数字是否在特定范围内;以及 Burritos,来自 Guillermo Muntaner,它是一个完整的示例属性包装器库,你可以在项目中使用,包括 @Clamping@Expirable@Trimmed 等等。

你最喜欢的属性包装器用法是什么?在 Twitter 上发送推文 @swiftlang 告诉我们!