View in English

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

クイックリンク

5 クイックリンク

ビデオ

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

その他のビデオ

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

  • 概要
  • トランスクリプト
  • コード
  • Xcode Playgroundsでプロトタイプを作成

    Xcode Playgroundsで新しいコードのプロトタイプを作成することにより、機能開発を加速し、変更を検証するためにプロジェクトをやり直す必要がなくなります。プロジェクトやパッケージでプレイグラウンドを使うことで、様々なシナリオでコードを試したり、複雑な構造やユーザインターフェイス要素を含む返された値の詳細を見たりすることができます。このため、プロジェクトに組み込む前に、機能改善のイテレーションを行えます。

    関連する章

    • 3:00 - Exploring the data model and inspecting UI snapshots
    • 14:26 - Becoming familiar with a new package
    • 18:07 - Using the Live View
    • 22:03 - Running the updated project

    リソース

      • HDビデオ
      • SDビデオ

    関連ビデオ

    WWDC20

    • Xcode PlaygroundにおけるPackageとProject
  • ダウンロード

    ♪ ♪

    こんにちは Xcode Playgroundsチームの エンジニア Dariuszです 今日はXcode Playgroundsの 機能向上についてご紹介します プロジェクトで新機能のプロトタイプを 作成しやすくなりました Xcode Playgroundsを利用して ワークフローを改善できる シナリオが数多くあります まず第一に 新機能のプロトタイプを作成したり コードに小さな変更を試したりする際に プロジェクトの再構築や再起動を 省略できます ショッピングアプリで注文概要を 生成するロジックなど これまで非常に困難だった コードの実行もずっと簡単になります もちろん このようなコードは テストで検証可能で また検証されるべきです しかし Playgroundsは開発の 素晴らしい出発点になるでしょう プロジェクトに 新しい依存関係を導入する前に コードを試すのに最適な環境です

    Xcode Playgroundsがプロジェクトで どのように役立っているか説明しましょう 私は野生動物の写真を扱う 小さなアプリの開発に取り組んでいます 現時点では アプリは すでに見つけて写真を撮った動物種を 記録するのに役立っています さて このアプリに野生動物の写真撮影の かなり重要な一面を 手伝ってもらいたいと思っています それは実際に まず動物を見つけることです

    チェックリスト表示に 新しいタブを導入したいと思います

    すでに表示の実装を始めていますが このユーザーインターフェイスには とても満足しています それぞれの鳥にはチェックボックスがあり 進捗状況をトラッキングできます しかし 2,000羽以上の鳥が リストにあるので 多分あまり進歩しているとは 感じられないでしょう このリストを もう少し絞り込めたら最高でしょう

    そのためには カスタムChecklistViewで birdToShowの算出プロパティを 調整する必要があります 現時点では 単に北米用に構成された BirdProviderタイプを 作成するだけです そして 北米大陸で見られる すべての鳥類を返します プロジェクトの頻繁な 再構築と再起動を避けるため ChecklistViewに移動して 変更を確認します このコードを Xcode Playgroundで 調整してみます

    まず プロジェクトに 新しいPlaygroundを追加します

    これはiOSアプリなので iOSテンプレートをそのまま使います フィルタバーに「playground」と入力して 空白のPlaygroundを選択します

    この場合 多分このPlaygroundを 後から削除することになるでしょう いくつか試した後に デフォルトの 「MyPlayground」名を残すためです

    Playgroundのデフォルトの コンテンツを削除します

    さらに速いイテレーションのために メニューで「自動実行」に切り替えます 下部バーの実行ボタンを長押しすると 表示されます

    これにより Playgroundが自動的に実行され 変更を中止するたびに コード全体が実行されます 注意事項として プロジェクトに追加された Playgroundには2つの設定があります デフォルトで有効になっているBuild Active SchemeとImport App Typesです 各Playgroundの実行前に アクティブなスキームが確実にビルドされ アプリのターゲットモジュールが 自動的にインポートされることを確認します これにより プロジェクト内で 定義されたタイプの作業が はるかに簡単になります インスペクタを閉じて Playgroundに もう少し余裕を与えることができます

    BirdProviderインスタンスを 宣言して始めましょう ChecklistViewのbirdsToShow プロパティで見たのと同様です

    エディタの右側にある結果サイドバーに この宣言によりPlayground結果が 生成されたことが表示されます インライン結果トグルで詳細を確認できます

    インライン結果には このBirdProvider インスタンスの詳細が表示され そこに鳥の配列と該当地域の 2つのプロパティも表示されます Xcode 15では 各行に タイプ情報ラベルも含まれ タイプの簡単な概要を伝えます 各行のツールチップで 詳細を見ることができます

    例えば ツールチップでは 次のように示されています BirdProviderタイプは アプリモジュールからのもので 地域列挙型の値は その構造体の中で定義されています 配列の行を展開して 鳥の詳細を見てみましょう

    Xcode 15では インライン結果表示の 操作を開始すると 結果を生成したソースコードが 強調表示されます この場合 birdProvider定数に 割り当てられた値が表示されます これにより 表示された値が 非常に理解しやすくなります

    配列要素を詳しく見てみましょう

    地域と鳥の配列のプロパティに関する 素晴らしい概要を見ました しかし デフォルトでは各鳥を表す行は 配列のインデックスしか表示されません これは カスタムBirdタイプに 説明が定義されていないためです

    これを改善するには Birdタイプを CustomStringConvertibleプロトコルに 適合させることです 拡張機能をPlaygroundに または そのSourcesディレクトリに 追加します このオプションは両方ともPlaygroundの スコープ内のBirdタイプにのみ影響します デバッガなどに依存している他の場所では 素晴らしい新しい説明は得られないでしょう このため Birdタイプを定義する ファイルに拡張子を追加します

    新しい説明定義で 各行には 鳥の一般名と学名が表示されるはずです Playgroundに戻って 新しい説明が 実際に動作しているのを見てみましょう

    Playground実行の自動モードでは Playgroundは再度開くと 自動的に再実行されます 鳥の配列行を再度展開して 説明を確認してみましょう

    これはずっと良くなりました これで 行を展開しなくても 行が何を表しているかが明確になりました しかし Birdタイプの 他のプロパティを見てみましょう

    すでに鳥を見つけて その何羽かを写真に撮りましたが その中の一部は すでに写真のプロパティを 持っていることがわかります このニシツノメドリのように

    この行をクリックすると写真が表示されます 新しい分割表示ベースの ユーザーインターフェイスで プレビューと一緒に オブジェクトの構造を見ることができます

    デフォルトでは カスタムBirdタイプの行をクリックしても このようなプレビューはありません 私はすべての種の名前に 詳しいわけではないので ここで 写真がすぐに見れると助かります これを可能にするには CustomPlaygroundDisplayConvertible プロトコルを使います プロトコルの名前が示すように この適合性は Playgroundの 表現にのみ影響します そこで今回は Playgroundの ソースディレクトリに拡張子を追加します

    Birdタイプにアクセスするために アプリモジュールをインポートします playgroundDescriptionとして 写真のプロパティを返す 簡単な拡張子を追加します

    return文で 明示的に写真をAnyを キャストしていることにご注意ください これがないと コンパイラは 値がオプションであるという 重要な情報の一部を失うことを警告します Xcode Playgroundはオプションを扱うので この場合は問題ありません オブジェクトのカスタム説明を 作成するだけで playgroundDescriptionプロパティで nilを返しません もう一度Playgroundに戻って 新しい説明を確認してみましょう

    Xcode 15では playgroundDescriptionは CustomPlaygroundDisplayConvertibleに 適合するタイプによって返され オブジェクトの構造に沿って 分割表示で示されます

    さて すでに写真がある鳥は 行を展開しなくても クリックするとすぐに表示されます これにより このカスタムタイプの大規模な コレクションの扱いがより簡単になります

    しかし 今日はまだ写真のない鳥に 焦点を当てます このインライン結果を閉じて すでに写真がある すべての鳥を除外しましょう

    この2つのサイドバーの注釈が 少し違って見えます それは 新しい行に複数の式があるためです 新しいコントロールをクリックすると 各表現に見慣れた概要が 表示されます

    インライン結果トグルにカーソルを乗せると ソースコードの範囲が強調表示されます

    これにより 配列はBirdsToFind定数に 割り当てられた結果であることが明らかです trueは最新の値で フィルター関数に渡される クロージャによって生成されました

    結果のサイドバーには すべての鳥の数が表示され まだ撮影していないのは 1,800羽を超えていますが これはかなり大きな数です これは最終的な目標かもしれませんが 例えばフクロウなど より小さなグループに焦点を当てることで 数をより低くしたいです 6月はフクロウ観察に最適な月です でもその話題は 別のセッションにしましょう 他の科の鳥を除外しましょう

    現在 配列には5つの要素のみですが これなら取り組めそうです 鳥のこの小さなグループで カスタムChecklistViewを試してみましょう そのために ChecklistViewインスタンスを作成します そして 鳥を一羽ずつ追加します

    ChecklistViewの インライン結果を開いてみましょう

    UIViewのサブクラスとして スナップ写真と共にプロパティも表示され 値ヒストリーモードに 切り替えることができます また 新しい分割表示ベースの ユーザーインターフェイスを使用しています

    これで 各ループ反復でChecklistViewが どのように見えるか確認できます

    実際 これは表示の問題点を見つけるのに 役立ちました 1羽の鳥に対しヘッダーに「birds」と 誤って書かれています 文字列を調整することで修正できるはずです 新しい文字列カタログで定義されています

    最初の行は ChecklistViewのヘッダーで 使われている行のようです コンテキストメニューを出して 「複数形で異なる」を選択します

    そうすると 影響を受ける行の状態が 「再調査が必要」に変わります この文字列の単数形を調整します

    新しい文字列カタログについて詳細は 「Discover String Catalogs」の セッションをご覧ください Playgroundに戻って チェックリストがこの変更で どのようになっているか見てみましょう

    ヘッダーは各ループ反復で正しく見えます これで このインライン結果を 閉じることができます

    ChecklistViewを使う準備ができました 早速 使用したコードを持ってきます 鳥のリストを絞り込み プロジェクトに持ってきます

    この3行をChecklistViewの birdsToShowプロパティに コピーします

    また 新しくはるかに小さな鳥の配列で return文も追加します

    プロジェクトを再実行する前に もう一つの 機能のプロトタイプを作りたいと思います カスタムチェックリスト表示の各行に 開示インジケータがあることがわかります リストの行を選択すると 簡単な地図表示が開きます まだそれほど便利ではありませんが データを取り出したいと思います 選択した鳥の最新の目撃情報について それを地図上に表示します そのためには ChecklistViewの sightingsToShow(for bird:)関数を 調整する必要があります そのために プロジェクトに 依存関係を1つ追加しました BirdSightingsパッケージを使うと 簡単にデータを取り出せます 人々が目撃情報を報告する 市民科学サイトからです

    そのパッケージはまだ使ったことがないので そのAPIはまだよく知りません 幸いなことに パッケージにはドキュメントが含まれていて Playgroundの形式で いくつかの例を示しています

    これは パッケージのクライアントが 提供されたAPIを試すことができる 優れた方法です fetchSightings関数に 2つの引数を指定する必要があるようです 探す鳥のコードと探す場所のコードです このPlaygroundを実行すると 期待される結果について

    詳しく知ることができます

    Playgroundに戻って使ってみましょう

    ナビゲータを閉じると エディタ領域にさらに余裕ができます

    関数を呼び出す前に 2つのimport文を追加する必要があります 座標を扱えるように CoreLocation フレームワークをインポートし そして そのAPIを使用するBirdSighting フレームワークをインポートします

    関数の引数については リストの最初の鳥から始めれば 簡単に開始できます

    コミミズクを探すことになりそうです ここでは強制的アンラップを 使用していることにご注意ください エラー処理については Playgroundの環境では それほど心配する必要はありませんが コードをプロジェクトに取り込む時は 心に留めておくことが重要です

    場所については おそらく現在地を使うことが多いでしょう しかし 具体的な座標を提供する技量は 素晴らしいことで コードのテストと ドライブ旅行の計画を立てることです Apple Parkの周りに 何があるか見てみましょう

    ネットワーク通話を導入する前に 手動モードに切り替えて 不必要な呼び出しを確実に避けるために Playgroundの実行を切り替えます このようなリクエストは時間がかかるため 新しい機能については できるだけ早く 繰り返し処理したいと考えています そのためには もう一度メニューを表示し 下部のバーにある 「手動で実行」を選択します

    これで コードの実行部分を 完全にコントロールできるようになりました フェッチコードを追加してみましょう

    ソースエディタのガターのコントロールは この2行を実行しても 上ですでに実行したすべての行は 再実行されないことを示しています 新しい行を実行して データを取得できるか見てみましょう

    幸運にも 目撃情報があります 最初のものを見てみましょう 最新のものです

    コミミズクが最近目撃されたようです Changmen Cliffs保護区です この地域のバードウォッチングの ホットスポットにまだ詳しくないので SightingMapViewで目撃情報のデータを 確認できるのは素晴らしいことです 取り出した目撃情報データを使って 初期化しましょう

    地図表示のような複雑な ユーザーインターフェイス要素の場合 Playgroundのライブ表示を使い 大きくて完全に相互作用の プレビューを見ることができます これを使うには まずPlaygroundSupport フレームワークをインポートします

    これで ライブ表示を設定して Playgroundを実行する準備ができました

    Playgroundのすでに実行されている部分を ファイルの先頭に import文を追加することで変更しました ソースエディタのガターのコントロールは ファイル全体を再実行する必要があることを 教えてくれます 前回の実行結果は失われますが この場合 それは問題ではありません それでは Playgroundを実行してみます

    Apple Park周辺には島はないはずです ライブ表示は完全に相互作用なので 少しズームアウトできます iPhoneシミュレータのように 現在地を確認できます

    どうも東に行き過ぎたようです エディタオプションで ライブ表示を閉じましょう そして どこで問題が発生したのか 見てみましょう

    SightingMapViewは mostRecentSighting定数で初期化されたので その値を確認してみましょう インライン結果を開く代わりに 値をざっと見ることができます サイドバーの目のアイコンをクリックします

    Xcode 15では Playgroundの結果を改善しました MapKitの一部とCoreLocationタイプです CLLocationCoordinate2Dのプレビューが Playgroundで表示可能になりました それでは locationプロパティを 見てみましょう

    これは同じ場所を指しているように 見えますが SightingMapViewが原因ではないようです BirdSightingsパッケージから 間違った場所を取得しました したがって パッケージの問題が 原因である可能性があります あるいは 最初から間違った場所を 渡したのかもしれません 後者を検証してみましょう

    (音声なし)

    ここもApple Parkの近くではないようです 東に行き過ぎたので これは単に西と東を混ぜただけの 問題かもしれません 経度の前にマイナス記号を追加して これを修正してみましょう そして Playgroundを再実行しましょう

    (音声なし)

    さて ここは間違いなくApple Parkです Playgroundの 残りの部分を実行しましょう 更新された場所で エディタオプションの ライブ表示を再度開きます

    (音声なし)

    この方が良いですね 今では Coyote Hillsが新種を撮影するのに 最高の場所だとわかりました 早速 フェッチコードをChecklistViewに 取り込んでみましょう

    この3行を sightingsToShow関数に コピーします

    (音声なし)

    ここでは 常にハードコードされた Apple Parkの場所を使う代わりに これを lastCurrentLocationに 置き換えます CLLocationManagerから取得したものです

    また 新しいmostRecentSightingの return文も追加します

    いよいよ変更を加えて プロジェクトを実行します

    (音声なし)

    鳥の小さなグループに焦点を絞ったことで チェックリストがより現実的に見えます では 行をクリックすると 何が起こるのか見てみましょう

    素晴らしいです アプリは選択した鳥の最新の目撃情報を 表示できるようになりました もちろん 改善の余地は まだたくさんあります 例えば 進捗状況インジケータを 表示する必要があります 目撃情報は バックグラウンドで取り出せますが これは素晴らしい出発点です このアプリは すでにとても役立ちそうです Xcode Playgroundsでは この改善が行われたので とても作業しやすくなりました このセッションでは Xcode Playgroundsを使用したので プロジェクトの新機能のプロトタイプを 迅速に作成できます CustomStringConvertibleと CustomPlaygroundDisplayConvertible プロトコルを使用しました カスタムタイプの表現を カスタマイズすることができます Playgroundの実行モードを調整する ことでワークフローを高速化できます 値ヒストリーモードを使うことで 複数の入力に対して クラスがどのように反応するか すぐに確認できるようになりました 最後に Playgroundのライブ表示を使い 複雑なユーザーインターフェイス要素を 詳しく見てきました ご視聴ありがとうございました

    • 2:04 - birdsToShow computed property before the required changes

      var birdsToShow: [Bird] {
          // TODO: Narrow down the list of birds to find.
          let birdProvider = BirdProvider(region: .northAmerica)
          return birdProvider.birds
      }
    • 4:15 - birdProvider instance

      let birdProvider = BirdProvider(region: .northAmerica)
    • 6:31 - CustomStringConvertible

      extension Bird: CustomStringConvertible {
          
          public var description: String {
              return "\(commonName) (\(scientificName))"
          }
          
      }
    • 8:17 - CustomPlaygroundDisplayConvertible

      extension Bird: CustomPlaygroundDisplayConvertible {
          
          public var playgroundDescription: Any {
              return photo as Any
          }
          
      }
    • 9:45 - Birds without a photo

      let birdsToFind = birdProvider.birds.filter { $0.photo == nil }
    • 10:52 - Owls without a photo

      let owlsToFind = birdsToFind.filter { $0.family == .owls }
    • 11:15 - Verifying the ChecklistView

      let checklist = ChecklistView()
      for bird in owlsToFind {
          checklist.add(bird)
      }
    • 13:41 - birdsToShow computed property with the required changes

      var birdsToShow: [Bird] {
          let birdProvider = BirdProvider(region: .northAmerica)
          let birdsToFind = birdProvider.birds.filter { $0.photo == nil }
          let owlsToFind = birdsToFind.filter { $0.family == .owls }
          return owlsToFind
      }
    • 14:21 - sightingToShow function before the required changes

      func sightingToShow(for bird: Bird) -> Sighting? {
          // TODO: Use BirdSightings package to fetch the most recent sighting.
          return nil
      }
    • 15:04 - BirdSightings package example

      let barnOwlCode = "BNOW"
      let centralParkLocation = CLLocationCoordinate2D(latitude:  40.785091, longitude: -73.968285)
      
      let sightingsProvider = SightingsProvider()
      sightingsProvider.fetchSightings(of: barnOwlCode, around: centralParkLocation)
    • 16:08 - Parameters for sightings fetching

      let bird = owlsToFind.first!
      let appleParkLocation = CLLocationCoordinate2D(latitude: 37.3348655, longitude: 122.0089409)
    • 17:31 - Sightings fetching

      let sightingsProvider = SightingsProvider()
      let sightings = sightingsProvider.fetchSightings(of: bird.speciesCode, around: appleParkLocation)
    • 18:23 - Initializing the SightingMapView

      let mostRecentSighting = sightings.first
      let sightingMapView = SightingMapView(sighting: mostRecentSighting)
    • 18:55 - Setting up the playground's live view

      import PlaygroundSupport
      PlaygroundPage.current.liveView = sightingMapView
    • 22:20 - sightingToShow function with the required changes

      func sightingToShow(for bird: Bird) -> Sighting? {
          let sightingsProvider = SightingsProvider()
          let sightings = sightingsProvider.fetchSightings(of: bird.speciesCode, around: lastCurrentLocation)
          let mostRecentSighting = sightings.first
          return mostRecentSighting
      }
  • 特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。

    クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。

Developer Footer

  • ビデオ
  • WWDC23
  • Xcode Playgroundsでプロトタイプを作成
  • メニューを開く メニューを閉じる
    • 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.
    利用規約 プライバシーポリシー 契約とガイドライン