ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
Xcode 15の新機能
Xcode 15における最新の生産性とパフォーマンスの向上について紹介します。コード補完やXcode Previewの改善の詳細や、テストナビゲータとテストレポート、そして合理化された配信プロセスについて学びましょう。また改善されたナビゲーション、ソース管理およびデバッグにも焦点を当てます。
関連する章
- 0:00 - Introduction
- 0:39 - Downloading Xcode
- 1:29 - Code completion updates
- 3:45 - What's new in asset catalogs
- 4:30 - Meet string catalogs
- 5:25 - What's new in Swift-DocC
- 7:01 - Meet Swift macros
- 8:40 - What's new in Previews
- 10:00 - The bookmark navigator
- 12:18 - What's new in source control
- 14:50 - What's new in testing
- 17:23 - Updates in the debug console
- 18:37 - Updates in Xcode Cloud distribution
- 19:37 - Signature verification and privacy manifests
- 21:03 - What's new in Xcode distribution
リソース
関連ビデオ
WWDC23
-
ダウンロード
♪ ♪ ♪ こんにちは Shilpaです 私はRyanです 今日はXcode 15の 新機能や改善点についてお話しします Xcodeはデベロッパ体験の中心的な存在です Xcodeは すべての開発ワークフローの要素を 一つのまとめることにより 単に楽しくアプリを作成できます 今日はXcode 15の 改善点についてお話しします 編集からナビゲーション 共有にテスト さらにはデバッグ、配信までカバーします 新機能について話す前に まずダウンロードすることが必要です リリース版Xcodeのダウンロードは Mac App Storeからが最適です 常に最新のツールを使用でき 新機能をフルに 活用できるからです。 昨年 watchOSとtvOSのシミュレータを ダウンロードオプションとし スタートを簡単にしました 今年はすべてのシミュレータを 別々にダウンロード可能にします。 iOSやAppleの新しい 空間コンピューティングも含まれ ニーズに応じてXcodeを設定できます これによりXcode本体のサイズは小さくなり すべてのシミュレータを入れない段階でも コードを書きやすくなります または デベロッパサイトから 最新ベータ版のダウンロードが必要なら どのシミュレータを含めるべきか選択できます ここからは本題に入りましょう まずはソースエディタの新機能についてです Code completionで必要なコードを 素早く間違いなく入力できます Xcode 15で、それはさらに賢くなります では見てみましょう Completionsは 新しいソース情報を活用します ここに、Backyard Birdsというプロジェクトがあります 新規ファイルを作成し PlantSummaryRowと名付けます 必要なimport文を足します 新しいstructを作るとcompletionsが PlantSummaryRowを提案しました 先程ファイル名に使ったからです このファイルを実行しましょう
実行が済みました Completionsの表示も改善されました 既定のargumentsがあるfunctionの場合 必要なparameterを得るのが 難しくなります 可能性のある既定argumentsの permutaionsの中から必要なものを選びます このVStackにframe modifierを足し キーボードの右矢印を押します 必要なものを選びます この場合はwidthです Context awarenessのおかげで コードへの提案が 向上されました VStackに戻って modifierを足すためを打つと paddingがトップに出ました これが頻繁に使われるmodifierだと Xcodeは知っているからです しかしmodifierをTextに足すと fontがトップに出てきました これらの提案には 周辺のコードも考慮されます 既にfontを変えました 別のmodifierを足すと トップの提案はboldです Textの場合 同じmodifierは 使うべきでないからです もう一つの例です このファイルではCLLocationで 鳥を探します 既にlatitudeをタイプしたので longitudeが提案されます これらは一緒に使用される propertiesだからです つまりより優れた提案で コードを安全に素早く書けます ねえRyan Power completionsを asset catalogsにも 応用するんでしょ? 教えてくれる? もちろんだよ Colorとimage assetsは Swift symbolsにサポートされ code completeが可能になります Asset catalogに custom colorsとimagesがあります Xcode 15は自動的にsymbolsを生成し string namesの代わりに これらを参照できます このイメージの名前を MultipleCloudsに変更し プロジェクトを作成すると このイメージを使う別のファイルで 問題が起きます これをCodeCompleteで直せます Type safetyのおかげで 実行時にカラーやイメージが ないという心配する必要はありません Xcode 15はcatalogsの パワーと柔軟性を localizationにも適用します String catalogsでlocalizationが 1か所に集約され 見直しと更新がまとめてできます String catalogsを使用するため プロジェクトを で コンバートします するとstoryboardsや .stringsや.stringsdictなど 移行可能なものすべてが表示されます 移行が終われば翻訳はすべて 1つのエディタにまとめられます 左のサイドバーで サポートする各言語の 翻訳の進歩状況を確認できます 最新化も簡単です すべてのstringsは直接 ソースから抽出されています Stringsが追加や削除されると エディタが影響する言語に注釈を付け 関連するstringsに印付けします 移行については 「Discover String Catalogs」を ご覧ください Shilpa, Documentationの新機能は? たくさんあるわ 明確で簡潔なコードで documentationもよりよくなります 将来の自分やAPIの利用者に 何か説明をしたいときには よりよいdocumentationが鍵になります すばらしいdocummentationはよいプレゼンテーションと同じ価値があります Xcode 15では美しいstylingとspacingで 非常に読みやすくなります でも最大の改善点はリアルタイムで プレビューを見せるassistantです 文書を作成中assistantを呼び出すには からを選び ジャンプバーの を選びます ソースエディタにタイプすると プレビューがリアルタイムで更新され 完成後のdocumentation archiveで どう表示されるかがわかります ではコードを足して 実際に見てみましょう 「このinitializerで対象の 鳥のイメージを…」 「表示する」と書き込みます そしてコードをペーストします この例はインターフェイスを含むので スクリーンショットで結果を示します Documentation catalogに含んだ BirdIconというイメージを参照します Documentation previewは 書類を思い通りに作成する役に立ちます 私のようにdocumentationに 情熱をお持ちの方は、ぜひ 「Create rich documentation with Swift-DocC」をご覧ください Documentation同様に コードが簡潔で理解できるのも重要です 今年からSwiftに パワフルな言語機能のSwiftマクロが 加わりました マクロはAPIを表現豊かにし コードの繰り返しを防ぎます Xcodeでの実装は、詳細をみることでき Swiftマクロによるコードをほかのコード同様に 扱えるようになります SwiftマクロはSDKのSwift packagesの一部です 数々のAppleのフレームワークに Swiftマクロを応用しています Swift standard libraryやfoundation そしてSwift data frameworkなどです また独自のmacro packageを 作成し共有できます Packageの作成に quick actionsを使います Command-Shift-Aで すべてのXcodeのmenu optionsに アクセスできる新機能です 新しいMacro packageには 役に立つ幾つかの例が 含まれています 私は既にEnumHelperを作っています EnumHelper内でCaseDetectionを マクロとして実行します Swiftマクロの素晴らしい点は 普通のSwift codeの生成です コードはきちんと包んで折り込まれています でもその詳細を見たり Swiftマクロのコードをデバッグしたければ quick actionsを使って Swiftマクロをその場で拡張することができます デバッグが必要ならマクロ内に breakpointを設定できます 「Expand on Swift macros」で Swiftマクロのさらなる 技術的理解を深められます またこの新知識で Swiftマクロを一から書きたいなら 「Write Swift macros」をご覧ください Swiftマクロを活用した Xcodeのもう一つの機能がPreviewsです Swiftマクロでシンプルで簡単に 新しいPreviews APIを記憶できます #Previewでpreviewを足します Account screenをpreviewします App detail columnには幾つか状態があり 別のpreviewを作って表示できます 両方のシナリオが見られます 現在previewsが2つあります 区別するため名前を付けます Placeholder Viewです
さらに改善があります UIKitとAppKitでもpreviewsが使用できます 古いFood Truckアプリでも UIViewControllerのpreviewを追加でき SwiftUIでのように素早く繰り返せます 次はpreviewsでウィジェット作成についてみてみましょう またタイムベースウィジェット作成の 新しいワークフローがAPIで可能です
Canvasですべてのエントリーを 見ることができます それらをナビゲートすると ウィジェットのtransitionsの動画が見れます これらについては 「Build programmatic UI with Xcode Previews」で 既存プロジェクトでのpreview機能の 適応方法について学べます それではRyanから navigationでの改善についてご紹介します ありがとう Shilpa プロジェクトの成長で複雑さが増し タスク中に参照すべき目印を 追うことが難しくなります そこでbookmarks navigatorが役に立ちます それを開くために source control navigatorの横を クリックします Documentationを足すべき箇所に bookmarksをしてあります もう一つ追加するのも簡単です ここを右クリックし を選びます
bookmarkhはNavigatorに そのpreviewに表示され この画面を変えたければクリックし 別のdescriptionを書き込みます Xcodeはその行に注釈を入れ 何をしたかったかを思い出させてくれます Bookmarksが増えましたが ソートやグループなど自由に 管理できます Documentation関連を グループ化しましょう 興味があるものを1つ選び セカンダリークリックでcontect menuを開き を選びます この新しいグループを 「Places to Add Documentation」と名付けます Bookmarksはまた Todoリストとしても使えます 左側のチェックボックスをクリックし チェックできます もしくはcontect menuで を選び消去します これでエディタから注釈が消去されます Bookmarkはコードだけではありません 検索クエリの管理にも最適です これまでtodoを使っていましたが 探しにくいので クエリをbookmarkし 探します
どの検索クエリでも可能です View modifiersのリストを 作りたい場合 Conforming Types クエリで viewModifier protocolの conformancesを探します
結果を右クリックしてそのクエリをBookmarkし を選びます Bookmark navigatorにクエリが現れます もし結果が変われば bookmarkの横のrefresh buttonで 更新ができます Xcode 15のbookmark navigatorで 管理の仕事が省け タスクに集中できます もう一つの改善点は 仕事の共有です コミットを同僚と 共有する時など 変更の同時更新は 変更と同じくいらい重要です Xcode 15のchanges navigatorと commit editorは すべての変更をレビューするための素晴らしいツールです プロジェクトにdocumentationを追加する場合 source control navigatorで 変更をレビューできます 最初に気付くのが ファイルのステータスのレポートの改善です ファイル名の横に stage modificationsが アイコンとして現れます 変更をレビューするため Uncommitted Changesを選び commit editorを出します この一つのスクロールビューで すべての変更を見ることができます 各セクションのコードが 一部垣間見れます 詳細を見るには drag handleを使って ファイルの表示範囲を広げます それぞれの変更はsource editorに表され 使い慣れたアノテーションやコントロールに アクセスできます BirdsNavigationStackファイルに 問題があります ミスタイプがあるようですが ここを去らずに直すことができます Xcodeが変更を処理し問題を取り除きます またeditorが直ちに changes barでunstagedと 表示しました
BirdsNavigationStackがハイライトされ stagedとunstagedの 変更があることを示しています 次のcommitで修正するため changes barをクリックして を選択します またデバッグに使っていたlog文を 誤ってstageしています 再びchanges barで を選択します Staging controlsは使用が簡単で Xcodeを通して統合されています これまでの変更を確定する準備ができました まず最初に説明を commit message boxに記述します ボタンをクリックします Xcodeがcommitを作成し すぐ開いたcommit viewerで その要約を確認できます
最後にcommitを チームメートと共有します Commitの横のstatus indicatorをクリックし を選び、指示に従います Source control機能で タスクに集中できます Shilpa、テストにも 新機能があるよね 教えてくれる? もちろん テストはアプリを配信する中でも 重要なパートです リグレッションを素早くキャッチし 複雑さが増す中 アプリの質を維持します テスト機能にも大きな改善があります まずtest navigatorが Swiftで一から書き直され 効率的になりました テストを実行 またはリアルタイムでテスト結果を表示するとき 最新のXcode15では 45%速くなりました Test navigatorはあなたのテスト計画によって構成され 気にかけているテストを探しやすくします またフィルターで"予期された失敗"のような 結果の種類に基づき検索できます XcodeかXcode Cloudでテストを実行すると test reportsは結果を把握することを助け 焦点を当てるべき箇所を教えてくれます まずテスト全体のハイレベルな概要から始まります その一つのInsightsは パターンベースの結果分析です Test section内で テスト行程を理解できます 違うデバイスや設定を通じて テストをパスしたか失敗したかが 簡単にわかります Insightsはテスト結果を分析し これまで知らなかった関係性ある不具合を 特定します また結果まで時間がかかると 思われるテストを 警告してくれます
ここでは2番目のinsightが気になります を押すと不具合があり さらに調べねばなりません Overviewで すべてのテストを示す test listsをみることができます 結果型などのフィルターにかけ 結果を絞り込みます Accountボタンのタップで 幾つもの言語で同じエラーが出ています 詳細を知るためindividual classか 新しい専用のTest Details viewで 各テストメソッドを確認できます Test Details viewでは結果データを 違う方法で探求するtabsがあり RunsやMetricsなど 細かく分類することができます UIテストの失敗をデバッグするは Automation Explorerでより楽しくなります このExplorer は対話的で テストの再生を見たり timelineをスクラブできます タッチ入力などは ビデオにオーバーレイされます このテストの場合 Accountボタンのタッチに不具合があったため UIの階層を調べます これでUIの修正が簡単になります さらなる詳細は 「Fix failures faster with Xcode test reports」を ご覧ください Ryanにもどして 次はデバッグについてです テストとデバッグは一つのセットです アプリの質を高めるという目的は同じです 今年はデバッグも改善され その一つがXcodeでのOSLogの統合です OSLogはランタイム情報の捕捉に 適したツールです 構造化したカスタマイズ可能な ロギング機構で結果を整えます Xcode 15の コンソールはOSLogをフルサポートし subsystem categoryやseverityのような ログデータの複雑なフィルタリングを 実行できます ログの表示も非常にきれいです 焦点はログコンテンツで それ以外のデータはきちんと隠されています 背景色は各ログエントリーの重大さを示し 長いログアウトプットから 重大メッセージをすぐに探し出せます メタデータは隠れていますが 簡単にアクセスでき 見たいフィールドを選ぶだけです 特定のものを探す場合 フィルターフィールドで絞り込めます またメタデータやフルテキストで フィルターできます 私の好きな機能は ログエントリーから それを作成したコード行に 直接遷移できることです これらの詳細については 「Debug with structured logging」を ご覧ください 最後は配信についてです 配信はあなたのアプリを チームメートやベータテスター そしてユーザーのために世界に送り出すことです Xcode 15では この行程をより簡単で安全に改善しました まずはXcode Cloudです Xcode Cloudはアプリの配信に最適です Build versioningやapp signing distribution profileを自動的に行います 今年はさらに2つの機能が加わります 一つ目はTestFlightのtest detailsです Source codeの横にtest notesを 付け足せるようになりました これは自動的に 配信用TestFlight buildに含まれ アプリと共に notesがテスターに渡されます 二つ目はMacアプリの 公証サポートです 公証アクションを ワークフローに足すだけです ビルドが終われば アプリは自動的に公証され ダウンロード可能になります アプリの公証はユーザーに 改竄されていないことを証明するため重要です しかしみなさんが頼る SDKsとフレームワークの安全性も 同様に重要です これを保証するため XCFrameworksの署名検証が加わります 作者がフレームワークのコンテンツに 電子署名したものをXcodeで確認できます Framework inspectorに signature sliceがあり フレームワークの作者と署名者が ここに表示されます Xcodeはそれを記憶するため フレームワークの更新中に変更があれば その問題の警告が出されます これには続きがあります 作者はフレームワークに privacy manifestを含めます フレームワークがどのように 機密データを使用し守るかの詳細を示します Privacy manifestは フレームワークに付属され 署名パッケージの一部のため コンテンツは 作者のものだと保証されます Xcodeですべてのmanifestsを アプリのプライバシーレポートに まとめることもできます これがそのレポートです このレポートを使い App Store Connectの プライバシーラベルに 正確な情報を提供するよう デザインされています AppleはプライバシーにインパクトがあるSDKらと協力し 依存関係者全員が この貴重な情報を 提供するよう保証しています これらに関するさらなる詳細は 「Verify app dependencies with digital signatures」と 「Get started with privacy manifests」をご覧ください Privacy manifestsは アプリの配信に最適のツールです バグ修正や新機能を作成したら チームメートにだけ アプリを配信したいものです そこでXcode 15は TestFlight internal testing distribution optionをサポートします TestFlight internal buildsは チームメートだけが入手でき 間違ってユーザーに リリースすることはありません それを実現するのは簡単です App Store Connectでアプリを配信する際 を 選択するだけです
実際はこれより簡単です Xcodeは一般的な配信方法と設定の組み合わせを 既に用意しています まず、オプションから 想定している選択肢を選び 次にをクリックし完了です これ以上のステップはありません そしてApp Store Connectで配信すれば ビルドのステータスについて デスクトップ通知が届きます テスト準備ができれば 直ちに通知されます これらのアップデートで 素早く開発サイクルを回して配信でき チームメートやテスター そしてユーザーとのやりとりが スムーズになります これらの機能についての詳細は 「Simplify distribution with Xcode and Xcode Cloud」をご覧ください Xcode 15の新機能をざっと見てみました 簡単に手に入れ そして速く使用でき 数多くの改善を伴っています より集中して またスムーズで 楽しい開発が可能になります Xcode 15をダウンロードし 新しい機能を試してみてください ありがとうございました ♪
-
-
1:52 - Code Completion - PlantSummaryRow
import Foundation import SwiftUI import BackyardBirdsData import LayeredArtworkLibrary struct PlantSummaryRow: View { var plant: Plant var body: some View { VStack { ComposedPlant(plant: plant) .padding(4) .padding(.bottom, -20) .clipShape(.circle) .background(.fill.tertiary, in: .circle) .padding(.horizontal, 10) VStack { Text(plant.speciesName) } } } }
-
3:28 - Code Completion - Latitude & Longitude
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { if let mostRecent = locations.last?.coordinate { logger.debug("Handled coordinate update: \(mostRecent.latitude)") } }
-
6:18 - BirdIcon Documentation
/// Create the bird icon view. /// /// The bird icon view is a tailored version of the ``ComposedBird`` view. /// /// Use this initializer to display an image of a given bird. /// /// ```swift /// var bird: Bird /// /// var body: some View { /// HStack { /// BirdIcon(bird: bird) /// .frame(width: 60, height: 60) /// Text(bird.speciesName) /// } /// } /// ``` /// /// ![A screenshot of a view containing a bird icon with the bird's species name below it.](birdIcon)
-
7:37 - CaseDetection Macro
extension TokenSyntax { fileprivate var initialUppercased: String { let name = self.text guard let initial = name.first else { return name } return "\(initial.uppercased())\(name.dropFirst())" } } public struct CaseDetectionMacro: MemberMacro { public static func expansion< Declaration: DeclGroupSyntax, Context: MacroExpansionContext >( of node: AttributeSyntax, providingMembersOf declaration: Declaration, in context: Context ) throws -> [DeclSyntax] { declaration.memberBlock.members .compactMap { $0.decl.as(EnumCaseDeclSyntax.self) } .map { $0.elements.first!.identifier } .map { ($0, $0.initialUppercased) } .map { original, uppercased in """ var is\(raw: uppercased): Bool { if case .\(raw: original) = self { return true } return false } """ } } } @main struct EnumHelperPlugin: CompilerPlugin { let providingMacros: [Macro.Type] = [ CaseDetectionMacro.self, ] }
-
8:07 - Using CaseDetection Macro
@CaseDetection enum Element { case one case two } var element: Element = .one if element.isOne { // Handle interesting case }
-
8:50 - New Preview API
#Preview { AppDetailColumn(screen: .account) .backyardBirdsDataContainer() } #Preview("Placeholder View") { AppDetailColumn() .backyardBirdsDataContainer() }
-
9:22 - UIViewController Preview
#Preview { let controller = DetailedMapViewController() controller.mapView.camera = MKMapCamera( lookingAtCenter: CLLocation(latitude: 37.335_690, longitude: -122.013_330).coordinate, fromDistance: 0, pitch: 0, heading: 0 ) return controller }
-
17:34 - OSLog
import OSLog let logger = Logger(subsystem: "BackyardBirdsData", category: "Account") func login(password: String) -> Error? { var error: Error? = nil logger.info("Logging in user '\(username)'...") // ... if let error { logger.error("User '\(username)' failed to log in. Error: \(error)") } else { loggedIn = true logger.notice("User '\(username)' logged in successfully.") } return error }
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。