Help us understand the problem. What is going on with this article?

【SwiftUI】NavigationLinkは即評価される

SwiftUIのNavigationLinkはすぐに評価されてしまうので、場合によっては遅延評価されるように対処が必要という話です。

現象

たとえばこんなコードがあったとします。

サンプルコード
struct ContentView: View {
    var urls = ["a.com", "b.com"]

    var body: some View {
        HStack {
            List(urls) { url in
                NavigationLink(destination: BrowserContentView(url: url)) {
                    Text("Next Page")
                }
            }
        }
    }
}

ここで、BrowserContentViewはすぐに初期化されてしまいます。例えば、この中でurlで指定されているWebページを読み込んでいたとすると、a.comb.comも読み込まれてしまいます。一覧画面を作るときに、その遷移先まで初期化してしまうのではリソースがもったいないですね。

対策方法

このページにあるように、遅延評価をできるstructを作ってそれを差し込みます。

遅延評価用のstruct
struct LazyView<Content: View>: View {
    let build: () -> Content
    init(_ build: @autoclosure @escaping () -> Content) {
        self.build = build
    }
    var body: Content {
        build()
    }
}
修正後のコード
struct ContentView: View {
    var urls = ["a.com", "b.com"]

    var body: some View {
        HStack {
            List(urls) { url in
                NavigationLink(destination: LazyView(BrowserContentView(url: url))) {
                    Text("Next Page")
                }
            }
        }
    }
}

これで遅延評価されるようになりました。この方法ならリンクが押されたときに該当のWebページが読み込まれるようになります。

まとめ

NavigationLinkにおける落とし穴とその対策を紹介しました。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした