我正在尝试创建一个使用resizable()
函数的自定义图像修改器,因此我的content
应该是Image
。至少我是这样认为的。
错误消息:类型“ IconModifier”不符合协议“ ViewModifier”
struct IconModifier: ViewModifier {
func body(content: Image) -> some View {
content
.resizable()
.aspectRatio(contentMode: .fit)
.frame(width: 10, height: 10, alignment: .center)
}
}
答案 0 :(得分:9)
您可以改为扩展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)
}
}
您首先遇到错误:
类型'IconModifier'不符合协议'ViewModifier'
这意味着您的IconModifier
不满足ViewModifier
协议的要求,如果我们看到定义,则为:
func body(content: Self.Content) -> Self.Body
您有:
func body(content: Image) -> Self.Body
这不起作用。接下来,我们将其更改为Content
而不是Image
:
“ IconModifier.Content”类型的值(也称为“ _ViewModifier_Content”)没有成员“可调整大小”
这基本上是说任何.resizable()
都没有View
修饰符。 .resizable()
修饰符仅在extension Image
内部定义,因此没有其他View
具有此修饰符。
这是核心问题-无法通过View
中的Image
参数访问原始的content
(ViewModifier
就是我们想要的)。 / p>
这就是为什么我只是扩展了Image
的原因。
希望这种解释有所帮助!