例によるSwiftUI(SwiftUI by Example)20 Appendix B

How to fix “Modifying state during view update, this will cause undefined behavior”

このエラーは、ビューが実際にレンダリングされている間にSwiftUIビューの状態を変更しているために発生します。

実際の問題の例

//--------------------------------------------
struct ContentView: View {
    @State private var name = ""

    var body: some View {
        if name.isEmpty {
            name = "Anonymous"
        }

        return Text("Hello, \(name)!")
    }
}
//--------------------------------------------

問題を修正

//--------------------------------------------
struct ContentView: View {
    @State var name = ""

    var body: some View {
        Text("Hello, \(name)!")
            .onAppear {
                if self.name.isEmpty {
                    self.name = "Anonymous"
                }
            }
    }
}
//--------------------------------------------


How to fix “Protocol ‘View’ can only be used as a generic constraint because it has Self or associated type requirements”

SwiftUIが不透明な戻り値の型に大きく依存しているために発生します。

struct ContentView: View {
    var body: View {
        Text("SwiftUI")
    }
}

struct ContentView: View {
    var body: some View {
        Text("SwiftUI")
    }
}

Swift5.1で不透明な戻り値の型を使用する方法

How to use opaque return types in Swift 5.1

部内リンク
day-40(project8-part-2)

Swift 5.1は、不透明(OPAQUE)(不透明(OPAQUE))と呼ばれる言語に重要な新機能を導入し ます。不透明(OPAQUE)型は、オブジェクトの種類を具体的に知らなくても、オブジェクトの機能について説明されます。これは、Swiftの汎用機能を改善するためのより大きなロードマップの一部であるSE-0244を通じて実現されました。

プロトコルと不透明(OPAQUE)型の違いを忘れた場合は、次のことを考えてください。返すとFighterは「あらゆる種類のFighter型ですが、何がわからないsome Fighter」という意味ですが、返すとは「特定の種類のFighter型ですが、まだ何がわからない」という意味です。 「」後者の場合の違いは、基になる型がコンパイラーが認識している特定のものであるのに対し、前者の場合は文字通りプロトコルに準拠するものであれば何でもかまいません。メソッドを呼び出すたびに異なる場合もあります。

参考サイトリンク
不透明(OPAQUE)(OPAQUE)
Swift 5.1 に導入される Opaque Result Type とは何か

How to fix “Fatal error: No ObservableObject of type SomeType found”

このエラーは、一致するオブジェクトが見つからなかったために発生します。これは通常、オブジェクトを環境に配置するのを忘れたか、間違った環境に配置したことが原因です。

以下確認

YourView().environmentObject(yourEnvironmentObject)

How to fix “Cannot convert value of type ‘String’ to expected argument type ‘Binding’”

SwiftUIのコンポーネントは、@Stateまたはのようなものを使用して、プロパティへの双方向のバインディングを持つことを想定しています@ObservedObject。このエラーは、次のようなバインディングなしでインタラクティブコンポーネントを作成しようとしたために発生します。

TextField("Enter your name", text: name)

@State private var name = ""

TextField("Enter your name", text: $name)

How to fix “Cannot convert value of type ‘String’ to expected argument type ‘Text'”

SwiftUIがTextビューを持つことを期待している場所で文字列を使用しようとしたために発生します。

Alert(title: "Meh")

Alert(title: Text("Meh"))

How to fix “Referencing initializer ‘init(wrappedValue:)’ on ‘ObservedObject’ requires that ‘SomeType’ conform to ‘ObservableObject'”

既知

How to fix “Cannot convert value of type ‘() -> ()’ to expected argument type ‘() -> _’”

このかなり紛らわしいエラーメッセージは通常、コンテナを作成したが、その中にコンテンツを含めるのを忘れたために発生します。

VStack {

}

VStack {
    EmptyView()
}

How to fix images not resizing

SwiftUIImageビューを作成し、サイズが変更されていない場合は、次のようなコードを探します。

Image("example-image")
    .frame(width: 300, height: 300)

これにより、画像のフレームが明示的に設定されますが、画像のサイズ変更可能としてマークされません。正しい方法はresizable()、次のように、フレームの前に修飾子を追加することです。

Image("example-image")
    .resizable()
    .frame(width: 300, height: 300)


How to fix a Form Picker or a NavigationLink that isn’t tappable

NavigationLinkまたはが機能Pickerしていない場合、これは通常、SwiftUIが包含ビューがa内にあることを想定しているために発生しNavigationViewます。リスト行に開示インジケーターが表示される場合がありますが、無効になっているように見えます。

この問題を解決するにはNavigationView、次のようにビューをでラップします。

NavigationView {
    NavigationLink(destination: Text("Detail view")) {
        Text("Show detail view")
    }
}