swift - 是否可以编写一个函数来组成任意数量的 SwiftUI `ViewModifier's?
问题描述
考虑以下ViewModifier
将填充应用于特定的View
enum Padding {
case small
case medium
case large
}
private struct PaddingModifier: ViewModifier {
var edgeSet: Edge.Set = .all
var size: Padding
func body(content: Content) -> some View {
return content.padding(edgeSet, getSize())
}
func getSize() -> CGFloat {
switch size {
case .small:
return 2
case .medium:
return 8
case .large:
return 16
}
}
}
为了使ViewModifier
更具可读性,通常我会添加一个扩展函数View
extension View {
func padding(_ size: Padding, _ set: Edge.Set = .all) -> some View {
return modifier(PaddingModifier(edgeSet: set, size: size))
}
}
但是,假设我想将此修饰符应用于任意Edge.Set
值列表。如何编写具有(Padding, [Edge.Set]) -> some View
适用PaddingModifier
于每个签名的函数Edge.Set
?
我的第一个想法是如下所示,但Self
不能符合some View
extension View {
func padding(_ size: Padding, _ set: Edge.Set = .all) -> some View {
return modifier(PaddingModifier(edgeSet: set, size: size))
}
func padding(_ size: Padding, _ set: [Edge.Set]) -> some View {
set.reduce(self) { $0.padding(size, $1) }
}
}
解决方案
是Edge.Set
a OptionSet
,所以使用 first 修饰符已经可以编码(类似于 built-in .padding([.leading, .trailing], 20)
)
Text("Demo")
.padding(.small, [.leading, .trailing])
看起来想padding(_ size: Padding, _ set: [Edge.Set])
多了。
推荐阅读
- apache-spark - 在 Spark 中 datetime.datetime.fromtimestamp 有什么作用?
- c++ - Jenkins 向应用程序控制台发送无效输入
- android - 我可以有多个具有相同项目布局的回收站视图吗?
- asp.net-core-webapi - API NET CORE:错误:400“'I' 是值的无效开始。路径:$ | LineNumber:0 | BytePositionInLine:0。”
- python - 如何修复模块“tensorflow.python.keras.activations”没有属性“get”错误?
- amazon-rds - 连接到 AWS MariaDB 并使用 boto3 运行查询
- java - 尝试执行简单的 servlet 程序时出现错误。映射中是否缺少任何东西?
- node.js - NodeJS Bull queue.add 字符串化数据导致错误
- java - 使用位图时,Android MLKit 人脸检测未检测到人脸
- javascript - Javascript 中的电子邮件验证 - 如何添加额外条件