ストリーミングはほとんどのブラウザと
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
リソース
関連ビデオ
WWDC20
-
ダウンロード
♪ ♪
こんにちは 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 }
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。