重用多种类型的扩展
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 上查看与我类似的问题,我已经到了这个阶段,但我遇到了错误:
- “文本不符合 TextStyle 协议”
- “TextEditor 不符合 TextStyle 协议”
我错过了什么?
你只需要 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
我正在尝试在跨多种类型的扩展中重用一项功能,但我目前在使用这些类型时遇到困难。我的代码如下:
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 上查看与我类似的问题,我已经到了这个阶段,但我遇到了错误:
- “文本不符合 TextStyle 协议”
- “TextEditor 不符合 TextStyle 协议”
我错过了什么?
你只需要 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