web-dev-qa-db-ja.com

SwiftUIで複雑なクロージャーの戻り値の型を推測できない

SwiftUIに関するAppleのチュートリアルのパート3 ユーザー入力の処理 に続いて、次のエラーが発生します。

複雑なクロージャーの戻り値の型を推測できません。明確にするために明示的な型を追加する

チュートリアルと同じコードを使用しています( 'Complete'サンプルコードから対処してもエラーは解決しません)。

誰かがここで何が間違っているのか手がかりを持っていますか?

enter image description here

struct LandmarkRow: View {
    var landmark: Landmark

    var body: some View {
        HStack {
            landmark.image(forSize: 50)
            Text(verbatim: landmark.name)
            Spacer()

            if landmark.isFavorite {
                Image(systemName: "star.fill")
                    .imageScale(.medium)
            }
        }
    }
}

問題の原因に関係なく、ここで明確にするために明示的な型を実際にどのように追加できますか?そのような場合の戻り値の型は何でしょうか?

-

更新

どうやら、あなたは2番目のチュートリアルの結果を3番目に続けるべきではありません。チュートリアルの中で文書化されていないいくつかのものがチュートリアル間で変更されました。プロジェクトファイルをGithubに追加したので、 差分を確認 できます。

rd tutorial のProjectファイルを新しくダウンロードして、3番目のチュートリアルを新しく開始することをお勧めします。

11
Tieme

問題はクロージャーではなく、ランドマークのisFavoriteプロパティにあります。

Landmark型では宣言されていません。コンパイラは、宣言されていないプロパティエラーを表示する代わりに、スタックビルドクロージャの戻り値の型を解決できないため、エラーを表示します。

すばらしい仕事Appleチュートリアルライター、さらに優れた1つのXcode11コンパイラ。

修正するには:

  1. isFavorite型でLandmark変数を宣言します。
  2. landmarkData.jsonisFavorite = falseエントリ。それ以外の場合、アプリは実行時にクラッシュします。
13
dirtydanee

この問題の背景

@dirtydaneeがすでに回答したように、これら2つのチュートリアルには違いがあります。しかし、問題の背後にある問題は、構成を行っているように見えますが、実際には、ジェネリックとプロトコルを使用して関数にネストされた関数であり、すべてを「魔法のように」解析してコンパイル関数にしていることです。

ただし、これらのジェネリックとプロトコルへの準拠は、正確ではない必要があります。機能ツリー全体がコンパイルできなくなったためです。しかし、コンパイラが実際にどの適合に失敗したかを判断するのは困難です。このため、実際に発生する場所ではなく、上部にエラーが表示されます。

ビューを自然でシンプルなブロックに分解して、何百行ものViewコードを注いで1つのバグを見つけないようにすることを強くお勧めします。

Dave DeLong ありました 本当に素晴らしい話 ViewControllersからビューを作成する方法について、今日までまだ当てはまります。基本的に、ビューを別のビュー内のサブビューとして使用することはありませんが、多くの単純なビューのビューを分解します。そうでなければ、これらのエラーはあなたを狂わせるでしょう。

2
Departamento B