是否可以编写一个函数来组成任意数量的SwiftUI`ViewModifier';s
考虑下面的是否可以编写一个函数来组成任意数量的SwiftUI`ViewModifier';s,swift,swiftui,composition,Swift,Swiftui,Composition,考虑下面的ViewModifier,它将填充应用于特定的视图 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 {
ViewModifier
,它将填充应用于特定的视图
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
}
}
}
extension View {
func padding(_ size: Padding, _ set: Edge.Set = .all) -> some View {
return modifier(PaddingModifier(edgeSet: set, size: size))
}
}
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) }
}
}
为了使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
}
}
}
extension View {
func padding(_ size: Padding, _ set: Edge.Set = .all) -> some View {
return modifier(PaddingModifier(edgeSet: set, size: size))
}
}
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
值列表。如何使用签名(Padding,[Edge.Set])->为每个Edge.Set
应用PaddingModifier
的某些视图编写函数
我的第一个想法如下所示,但是Self
无法符合someview
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
}
}
}
extension View {
func padding(_ size: Padding, _ set: Edge.Set = .all) -> some View {
return modifier(PaddingModifier(edgeSet: set, size: size))
}
}
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
是一个OptionSet
,因此使用第一个修饰符就可以进行编码(类似于内置的。填充([.leading,.training],20)
)
它看起来像是padding(\usize:padding,\uset:[Edge.set])
overthinked