请考虑以下将填充应用于特定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) }
}
}