Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否可以编写一个函数来组成任意数量的SwiftUI`ViewModifier';s_Swift_Swiftui_Composition - Fatal编程技术网

是否可以编写一个函数来组成任意数量的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