View in English

  • メニューを開く メニューを閉じる
  • Apple Developer
検索
検索を終了
  • Apple Developer
  • ニュース
  • 見つける
  • デザイン
  • 開発
  • 配信
  • サポート
  • アカウント
次の内容に検索結果を絞り込む

クイックリンク

5 クイックリンク

ビデオ

メニューを開く メニューを閉じる
  • コレクション
  • トピック
  • すべてのビデオ
  • 利用方法

その他のビデオ

ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。

  • 概要
  • コード
  • SwiftUIのパフォーマンスを解明

    SwiftUIでパフォーマンスのメンタルモデルを構築し、より速く、より効率的なコードを書く方法を学びましょう。パフォーマンスを妨げるよくある原因のいくつかとSwiftUIのハングやヒッチを学ぶことで、よりレスポンシブなViewを作成しましょう。

    関連する章

    • 0:00 - Introduction and performance feedback loop
    • 3:30 - Dependencies
    • 10:48 - Faster view updates
    • 13:24 - Identity in List and Table

    リソース

      • HDビデオ
      • SDビデオ

    関連ビデオ

    WWDC23

    • Instrumentsによるハング分析
    • SwiftUIにおけるObservationの説明
    • SwiftUIアニメーションの詳細

    WWDC21

    • SwiftUIの徹底解説

    Tech Talks

    • UIアニメーションの滞りおよびレンダーループに対する検討
  • このビデオを検索
    Array
    • 3:59 - DogView

      struct DogView: View {
        @Environment(\.isPlayTime) private var isPlayTime
        var dog: Dog
        var body: some View {
        	Text(dog.name)
        		.font(nameFont)
        	Text(dog.breed)
        		.font(breedFont)
        		.foregroundStyle(.secondary)
        		
        	ScalableDogImage(dog)
        	
        	DogDetailView(dog)
        	
        	LetsPlayButton()
        		.disabled(dog.isTired)
        }
       }
      }
    • 4:00 - ScalableDogImage

      struct ScalableDogImage: View {
      	@State private var scaleToFill = false
      	var dog: Dog
      	
      	var body: some View {
      		dog.image
      			.resizable()
      			.aspectRatio(
      				contentMode: scaleToFill ? .fill : .fit)
      			.frame(maxHeight: scaleToFill ? 500 : nil)
      			.padding(.vertical, 16)
      			.onTapGesture {
      				withAnimation { scaleToFill.toggle() }
      			}
      	}
      }
    • 4:01 - printChanges

      expression Self._printChanges()
    • 4:02 - ScalableDogImage + printChanges

      struct ScalableDogImage: View {
      	@State private var scaleToFill = false
      	var dog: Dog
      	
      	var body: some View {
          let _ = Self._printChanges()
      		dog.image
      			.resizable()
      			.aspectRatio(
      				contentMode: scaleToFill ? .fill : .fit)
      			.frame(maxHeight: scaleToFill ? 500 : nil)
      			.padding(.vertical, 16)
      			.onTapGesture {
      				withAnimation { scaleToFill.toggle() }
      			}
      	}
      }
    • 8:46 - ScaleableDogImage

      struct ScalableDogImage: View {
      	@State private var scaleToFill = false
      	var dog: Dog
      	
      	var body: some View {
      		dog.image
      			.resizable()
      			.aspectRatio(
      				contentMode: scaleToFill ? .fill : .fit)
      			.frame(maxHeight: scaleToFill ? 500 : nil)
      			.padding(.vertical, 16)
      			.onTapGesture {
      				withAnimation { scaleToFill.toggle() }
      			}
      	}
      }
    • 8:47 - Updated DogView

      struct DogView: View {
        @Environment(\.isPlayTime) private var isPlayTime
        var dog: Dog
        var body: some View {
        	Text(dog.name)
        		.font(nameFont)
        	Text(dog.breed)
        		.font(breedFont)
        		.foregroundStyle(.secondary)
        		
        	ScalableDogImage(dog)
        	
        	DogDetailView(dog)
        	
        	LetsPlayButton()
        		.disabled(dog.isTired)
        }
       }
      }
    • 8:48 - Final DogView

      struct DogView: View {
        @Environment(\.isPlayTime) private var isPlayTime
        var dog: Dog
        var body: some View {
        	DogHeader(name: dog.name, breed: dog.breed)
        		
        	ScalableDogImage(dog.image)
        	
        	DogDetailView(dog)
        	
        	LetsPlayButton()
        		.disabled(dog.isTired)
        }
       }
      }
    • 12:22 - DogRootView and FetchModel

      struct DogRootView: View {
      	@State private var model = FetchModel()
      	
      	var body: some View {
      		DogList(model.dogs)
      	}
      }
      
      @Observable class FetchModel {
      	var dogs: [Dog]
      	
      	init() {
      		fetchDogs()
      	}
      	
      	func fetchDogs() {
      		// Takes a long time
      	}
      }
    • 12:23 - Updated DogRootView and FetchModel

      struct DogRootView: View {
      	@State private var model = FetchModel()
      	
      	var body: some View {
      		DogList(model.dogs)
      			.task { await model.fetchDogs() }
      	}
      }
      
      @Observable class FetchModel {
      	var dogs: [Dog]
      	
      	init() {}
      	
      	func fetchDogs() async {
      		// Takes a long time
      	}
      }
    • 15:12 - List

      List {
      	ForEach(dogs) {
      		DogCell(dog: $0)
      	}
      }
    • 16:08 - List Again

      List {
      	ForEach(dogs) {
      		DogCell(dog: $0)
      	}
      }
    • 17:35 - List Fixed

      List {
      	ForEach(tennisBallDogs) { dog in
      		DogCell(dog)
      	}
      }
    • 18:25 - Sectioned List

      // Sectioned example
      struct DogsByToy: View {
      	var model: DogModel
      	var body: some View {
      		List {
      			ForEach(model.dogToys) { toy in
      				Section(toy.name) {
      					ForEach(model.dogs(toy: toy)) { dog in
      						DogCell(dog)
      					}
      				}
      			}
      		}
      	}
      }
    • 19:21 - DogTable

      struct DogTable: View {
      	var dogs: [Dog]
      	var body: some View {
      		Table(of: Dog.self) {
      			// Columns
      		} rows: {
      			ForEach(dogs) { dog in
      				TableRow(dog)
      			}
      		}
      	}
      }
    • 19:22 - DogTable Brief

      struct DogTable: View {
      	var dogs: [Dog]
      	var body: some View {
      		Table(of: Dog.self) {
      			// Columns
      		} rows: {
      			ForEach(dogs)
      		}
      	}
      }
    • 20:06 - DogTable Different IDs

      struct DogTable: View {
      	var dogs: [Dog]
      	var body: some View {
      		Table(of: Dog.self) {
      			// Columns
      		} rows: {
      			ForEach(dogs) { dog in
      				TableRow(dog.bestFriend)
      			}
      		}
      	}
      }

Developer Footer

  • ビデオ
  • WWDC23
  • SwiftUIのパフォーマンスを解明
  • メニューを開く メニューを閉じる
    • iOS
    • iPadOS
    • macOS
    • tvOS
    • visionOS
    • watchOS
    Open Menu Close Menu
    • Swift
    • SwiftUI
    • Swift Playground
    • TestFlight
    • Xcode
    • Xcode Cloud
    • SF Symbols
    メニューを開く メニューを閉じる
    • アクセシビリティ
    • アクセサリ
    • App Extension
    • App Store
    • オーディオとビデオ(英語)
    • 拡張現実
    • デザイン
    • 配信
    • 教育
    • フォント(英語)
    • ゲーム
    • ヘルスケアとフィットネス
    • アプリ内課金
    • ローカリゼーション
    • マップと位置情報
    • 機械学習
    • オープンソース(英語)
    • セキュリティ
    • SafariとWeb(英語)
    メニューを開く メニューを閉じる
    • 英語ドキュメント(完全版)
    • 日本語ドキュメント(一部トピック)
    • チュートリアル
    • ダウンロード(英語)
    • フォーラム(英語)
    • ビデオ
    Open Menu Close Menu
    • サポートドキュメント
    • お問い合わせ
    • バグ報告
    • システム状況(英語)
    メニューを開く メニューを閉じる
    • Apple Developer
    • App Store Connect
    • Certificates, IDs, & Profiles(英語)
    • フィードバックアシスタント
    メニューを開く メニューを閉じる
    • Apple Developer Program
    • Apple Developer Enterprise Program
    • App Store Small Business Program
    • MFi Program(英語)
    • News Partner Program(英語)
    • Video Partner Program(英語)
    • セキュリティ報奨金プログラム(英語)
    • Security Research Device Program(英語)
    Open Menu Close Menu
    • Appleに相談
    • Apple Developer Center
    • App Store Awards(英語)
    • Apple Design Awards
    • Apple Developer Academy(英語)
    • WWDC
    Apple Developerアプリを入手する
    Copyright © 2025 Apple Inc. All rights reserved.
    利用規約 プライバシーポリシー 契約とガイドライン