swift - 是否可以编写一个函数来组成任意数量的 SwiftUI `ViewModifier' s?

标签 swift swiftui composition

考虑以下将填充应用于特定ViewViewModifier

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 的函数,该函数为每个 Edge.Set 应用 PaddingModifier >?

我的第一个想法是像下面这样,但是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 是一个 OptionSet,因此使用第一个修饰符就可以进行编码(类似于内置 .padding([.leading , .trailing], 20))

Text("Demo")
   .padding(.small, [.leading, .trailing])

看起来 padding(_ size: Padding, _ set: [Edge.Set]) 想太多了。

关于swift - 是否可以编写一个函数来组成任意数量的 SwiftUI `ViewModifier' s?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61789064/

相关文章:

java - 复合对象如何与父对象通信?

ios - 如何在 Swift Alamofire 中使用 ssl 证书?

ios - 如何在 iOS 版 GCM 中正确调用刷新 token ?

ios - 在未排序的子节点上运行操作

ios - 在 swiftUI 中显示来自多个选项的工作表

swiftui - 使用 SwiftUI GeometryReader 而不影响外框?

swift - 如何在 SwiftUI 中设置 ScrollView 的 contentInset

design-patterns - 组合与立面模式

ios - Swift UICollectionView - 从另一个类添加/删除数据

kotlin - 如何将依赖项注入(inject) Kotlin 中的接口(interface)委托(delegate)?