解决方案
你可以直接扩展Image
。
使用方法如下:
struct ContentView: View {
var body: some View {
VStack {
Text("Hello World!")
Image("someName")
.imageIconModifier()
}
}
}
Image
扩展名:
extension Image {
func imageIconModifier() -> some View {
self
.resizable()
.aspectRatio(contentMode: .fit)
.frame(width: 10, height: 10, alignment: .center)
}
}
为什么你的解决方案行不通
首先,你遇到了这个错误:
Type 'IconModifier' does not conform to protocol 'ViewModifier'
这意味着你的 IconModifier
没有满足 ViewModifier
协议的要求,如果我们看一下它的定义:
func body(content: Self.Content) -> Self.Body
而你曾拥有:
func body(content: Image) -> Self.Body
它不起作用。所以下一步 - 我们将把它从Image
更改为Content
:
类型'IconModifier.Content'(也称'_ViewModifier_Content')的值没有成员'resizable'
这基本上是说没有任何View
.resizable()
修改器。 .resizable()
修改器在extension Image
内部定义,因此没有其他View
具有此修改器。
这就是核心问题 - 无法通过ViewModifier
中的content
参数访问原始View
(对我们而言是Image
)。
这就是我为什么只是为Image
创建了一个扩展的原因。
希望这个解释有帮助!
View
的扩展,或者特定类型(在这种情况下是Image
)的扩展。我不知道任何内置的修饰符是一个ViewModifier
。ViewModifier
是符合ViewModifier
协议的结构体,因此您可以使用.modifier(_:)
应用它。 - GeorgeViewModifier
,那么ViewModifier
的意义是什么?这里有一个相关主题的问题。您还可以将其与ModifiedContent
一起使用。 - George