重用多种类型的扩展

Reuse Extension for multiple types

我正在尝试在跨多种类型的扩展中重用一项功能,但我目前在使用这些类型时遇到困难。我的代码如下:

struct TitleStyle: ViewModifier {
    func body(content: Content) -> some View {
        content.font(.system(size: 34, weight: .bold))
    }
}

protocol TextStyle {
    associatedtype V: View

    func textStyle<Style: ViewModifier>(_ style: Style) -> V
}


extension TextStyle where Self: View {
    func textStyle<Style: ViewModifier>(_ style: Style) -> some View {
        ModifiedContent(content: self, modifier: style)
    }
}

extension Text: TextStyle {}
extension TextEditor: TextStyle {}

这将允许我创建一个可重用的组件,如下所示:

func ExpandingTextEditor<Style: ViewModifier>(text: Binding<String>, style: Style) -> some View {
    ZStack {
        TextEditor(text: text)
            .textStyle(style)

        Text(text.wrappedValue)
            .textStyle(style)
            .opacity(0)
            .padding(.all, 8)
    }
}

在 Stack Overflow 上查看与我类似的问题,我已经到了这个阶段,但我遇到了错误:

我错过了什么?

你只需要 View 的扩展,比如

extension View {
    func textStyle<Style: ViewModifier>(_ style: Style) -> some View {
        ModifiedContent(content: self, modifier: style)
    }
}

func ExpandingTextEditor<Style: ViewModifier>(text: Binding<String>, style: Style) -> some View {
    ZStack {
        TextEditor(text: text)
            .textStyle(style)

        Text(text.wrappedValue)
            .textStyle(style)
            .opacity(0)
            .padding(.all, 8)
    }
}

或者如果您只想查看特定的视图:

protocol TextStyle {}

extension Text: TextStyle {}
extension TextEditor: TextStyle {}

extension View where Self: TextStyle {
    func textStyle<Style: ViewModifier>(_ style: Style) -> some View {
        ModifiedContent(content: self, modifier: style)
    }
}

测试 Xcode 13.3 / iOS 15.4