エラーが発生しました」Type 'PlayButtonModifier' does not conform to protocol 'ViewModifier'
"そして私は理由を理解していません。
ViewModifier
の場合はImage
を作成しようとしているので、Image
でのみ定義されている場合にのみ.resizable()
を使用できます。
ViewModifier
プロトコルでは、Typealias
定義されたContent
があります。私のNAIV思考はこれが機能するべきだということでした。
struct PlayButtonModifier: ViewModifier {
typealias Content = Image
func body(content: Content) -> some View {
content
}
}
_
うーん、ダメ。簡単すぎる。構造体のための暗黙の型エイリアスで同じことが起こります。
struct PlayButtonModifier: ViewModifier {
func body(content: Image) -> some View {
content
}
}
_
同じエラーです。
ここで何が悪いの?それはどのように正しいでしょうか?
コメントやディスカッションと ASPERI と最後に次のコードスニペットを使用していただきありがとうございます。基本的には、画像に特化したViewModifier
の実装です。
protocol ImageModifier {
/// `Body` is derived from `View`
associatedtype Body : View
/// Modify an image by applying any modifications into `some View`
func body(image: Image) -> Self.Body
}
extension Image {
func modifier<M>(_ modifier: M) -> some View where M: ImageModifier {
modifier.body(image: self)
}
}
それを使うのは簡単です:
struct MyImageModifier: ImageModifier {
func body(image: Image) -> some View {
image.resizable().scaledToFit()
}
}
struct MyView: View {
var body: some View {
Image(systemName: "play").modifier(MyImageModifier())
}
}
修飾子はsome View
を返すか、Image
を返す場合は、100%満足していません。どちらの場合も不利益を持ち、Swiftuiと完全に統合されていません。
ImageModifier
を定義するときはImage
を返すと、画像固有の修飾子(実際にresizable()
)のみ、some View
を返す場合に画像を変更する可能性が低減されます。 2番目の修飾子はImageModifier
である必要があるため、チェーンViewModifier
_をチェーンできません。