web-dev-qa-db-ja.com

Swiftui:コンテンツがイメージなのです

エラーが発生しました」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
    }
}
 _

同じエラーです。

ここで何が悪いの?それはどのように正しいでしょうか?

14
jboi

コメントやディスカッションと 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 _をチェーンできません。

0
jboi