ハイライト
Swift 5.3 は、ランタイムのサイズとメモリ、Xcode の診断と完了、クロスプラットフォームのサポート、
@main複数の末尾クロージャ、Apple Archive、OSLog、Swift Numerics、ArgumentParser を使用すると、Swift はアプリ、コマンドライン ツール、システム レベルのライブラリ、およびサーバー関数をカバーできます。
主要内容
Swift 5 は ABI の安定性と API の安定性を完成させ、SwiftUI も Swift を Apple プラットフォーム開発の中心に押し上げました。 WWDC20 までに、問題は別のレベルになりました。Swift が十分に軽く、デバッグが十分で、システム層とサーバーのシナリオに適しているかどうかです (00:14)。
このセッションへの答えは、根底にあるパフォーマンスから始まります。 Swift 5.3 では、コード サイズのギャップが縮小し続けています。 UIKit アプリの Swift バージョンは、Objective-C バージョンのコード サイズの 1.5 倍未満に削減されました。 MovieSwiftUI のアプリケーション ロジック コード サイズは 40% 以上削減されました。同時にヒープメモリも減少し、同じSwiftアプリでも新バージョンでは起動時にランタイムオーバーヘッドが発生します。前年のバージョンの 3 分の 1 以下に減少しました (02:29、06:04)。
開発経験も同様に重要な位置にあります。コンパイラー診断はより正確な場所を示し始め、より多くの修正の手掛かりを提供します。 SourceKit ドライバーの補完とインデントは SwiftUI チェーン呼び出し用に最適化されており、一部の補完シナリオは Xcode 11.5 よりも最大 15 倍高速です。 LLDB は、Clang モジュールのインポートが失敗した場合に、DWARF デバッグ情報からフォールバックして C および Objective-C をインポートできます。変数ビューと式の評価の信頼性を高めるためのタイプ (07:18、09:31 ple.com/videos/play/wwdc2020/10170/?time=571)、10:58)。
言語レベルでは、Swift 5.2 と 5.3 に 10 を超える機能が追加されました。 Session では、日常のコードの形状を直接変更するいくつかの点を取り上げます。複数の末尾クロージャは、複数のクロージャ パラメータを使用した呼び出しを DSL により適したものにします。@mainエントリーポイントを特殊なものから変更するmain.swiftタイププロトコル機能に拡張されました。 KeyPath 式は関数として渡すことができます。 enumは自動合成できるComparable、静的プロトコル要件を満たすために enum ケースを使用することもできます(15:02、20:09、 23:29)。
最後の部分では、Swift を言語の更新から環境の更新に移行します。 Float16、Apple Archive、Swift System、および高速な OSLog が SDK に含まれています。 Swift Package Manager に加えて、Swift Numerics、Swift Argument Parser、および Swift Standard Library Preview もあります。これらは共に変化を示しています。Swift の新機能は、システム SDK のリリースを待つだけでなく、開発者の手に渡るオープンソース パッケージを通じて最初に利用可能になります (26:04、28:54 m/videos/play/wwdc2020/10170/?time=1734)、30:38)。
詳細
実行時の最適化により、Swift がシステム層により適したものになります
(02:29) Swift 5.3 の最適化は、ランタイム レベルとツール チェーン レベルの蓄積によってもたらされ、単一の API には対応しません。 Session は 2 つの具体的な指標を示します。Swift UIKit アプリのコード サイズは、Objective-C バージョンの 1.5 分の 1 です。 MovieSwiftUI のアプリケーション ロジック コード サイズは 40% 以上削減されます。これは、ダウンロード サイズと、システムが再利用できるクリーンなメモリに影響します。
(05:15) ヒープ メモリの例は、Swift 値型の利点を示しています。400 個のモデル オブジェクトは、Swift では約 20 KB のヒープ メモリを占有しますが、Objective-C バージョンでは約 35 KB のヒープ メモリを占有します。 Swift 5.3 では、起動キャッシュ、プロトコル適合性、型情報、Objective-C ブリッジングに関連するオーバーヘッドも削減され、Swift アプリのヒープ メモリを前年バージョンの 3 分の 1 以下に抑えることができます。
(06:52) 標準ライブラリが Foundation の下に配置された後は、Swift を使用して Objective-C レベルの下のフレームワークを実装できます。この変更は、Apple がランタイム メモリを圧迫し続ける理由を説明しています。システム デーモンと低レベルのフレームワークはあらゆるバイトに敏感です。
キーポイント:
- コード サイズの最適化、クリーン メモリ、ヒープ メモリはこのセッションの主要なテーマであり、付随的な指標ではありません。
- 値型、小さい文字列、および連続配列ストレージは、Swift モデル データがよりコンパクトである理由を説明します。
- 標準ライブラリの引き下げは、これまで C に依存していたシステムレベルのシナリオに Swift が参入できることを意味します。
クロスプラットフォームの Swift と AWS Lambda
(12:34) Swift 5.3 では、Ubuntu サポートが更新され、CentOS と Amazon Linux 2 が追加され、初期 Windows サポートがプレビューされます。その後、Session は AWS Lambda にクロスプラットフォーム機能をもたらし、オープンソースの Swift AWS ランタイムを使用してサーバーレス関数を作成しました。
import AWSLambdaRuntime
Lambda.run { (_, event: String, callback) in
callback(.success("Hello, \(event)"))
}
キーポイント:
import AWSLambdaRuntimeこの機能は、Foundation やシステム SDK API ではなく、オープン ソース ランタイム パッケージから得られるものであることを説明します。 -Lambda.runLambda ハンドラーを登録すると、クロージャがイベントを受け取り、コールバックを通じて結果を返します。 -event: Stringデモで最小の入力モデルを示します。これは、サーバー関数で Swift がどのように開始されるかを説明するのに適しています。 -callback(.success(...))戻り値を Lambda ランタイムに渡す際、この例は意図的に「Hello, world」レベルに保たれています。
@main型にエントリポイントを与える
(20:09) 以前は AppDelegate を使用できましたUIApplicationMainコンパイラに暗黙的に生成させるmain.swift。 Swift 5.3 では、この機能を次のように一般化しています。@main: プロトコルまたは親クラスでライブラリ作成者によって定義されます。static main、ユーザーは入口タイプを次のようにマークします。@main、コンパイラはエントリ コードを生成します。
// Type-based program entry points
import ArgumentParser
@main
struct Hello: ParsableCommand {
@Argument(help: "The name to greet.")
var name: String
func run() {
print("Hello, \(name)!")
}
}
キーポイント:
import ArgumentParserSwift オープンソース パッケージが導入され、以下の Argument Parser の例はそれを拡張し続けます。 -@mainにマークが付いているHello型に関して、エントリ ポイントは別個のファイルから型宣言の一部に変わります。 -ParsableCommandコマンド ライン ツールの規則を提供することで、ライブラリ作成者はプロトコルを通じてエントリ ルールをユーザーに公開できます。 -@Argumentコマンドラインの位置パラメータを属性として宣言します。run()ここでコマンド ロジックが実際に実行されます。
enum 自動合成Comparable
(23:29) Swift 4.1 はすでに合成できますEquatableそしてHashable。 Swift 5.3 は対象となる列挙型への拡張を継続Comparable、自然な順序で状態列挙型を使用して定型コードを少なく書くことができます。
// Synthesized comparable conformance for enums
enum MessageStatus: Hashable, Comparable {
case draft
case saved
case failedToSend
case sent
case delivered
case read
var wasSent: Bool {
self >= .sent
}
}
キーポイント:
MessageStatusも宣言しますHashableそしてComparable、比較ロジックはコンパイラによって合成されます。- case の宣言順序は比較順序となり、
.sentその後のステータスは送信済みを意味します。 -wasSent使用self >= .sentビジネス ルールを表現しており、手書きのスイッチよりも短いです。 - この例は、ステート マシン、メッセージ キュー、同期フェーズなどの線形順序を持つ列挙型に適しています。
Apple アーカイブと Swift システム
(26:55) Apple Archive は、Apple がシステムアップデートを配信するために使用しているテクノロジーに基づく新しいモジュール式アーカイブ形式で、Finder 統合、コマンドラインツール、および Swift API を提供します。この例では、ディレクトリへの書き込みを示しています。.aarファイルを作成し、LZFSE で圧縮します。
// Apple Archive
import AppleArchive
try ArchiveByteStream.withFileStream(
path: "/tmp/VacationPhotos.aar",
mode: .writeOnly,
options: [.create, .truncate],
permissions: [.ownerReadWrite, .groupRead, .otherRead]
) { file in
// Receives raw bytes and writes compressed bytes to `file`
try ArchiveByteStream.withCompressionStream(using: .lzfse, writingTo: file) { compressor in
// Receives archive entries, and writes bytes to `compressor`
try ArchiveStream.withEncodeStream(writingTo: compressor) { encoder in
// Writes all entries from `src` to `encoder`
try encoder.writeDirectoryContents(archiveFrom: source, keySet: fieldKeySet)
}
}
}
キーポイント:
ArchiveByteStream.withFileStreamターゲットファイルストリームを作成し、optionsそしてpermissions厳密に型指定された列挙を使用します。 -withCompressionStream(using: .lzfse, writingTo: file)元のバイトを圧縮してファイルに書き込みます。 -ArchiveStream.withEncodeStreamアーカイブ エントリを受信し、圧縮ストリームに渡します。 -writeDirectoryContents(archiveFrom:keySet:)例に示すように、ソース ディレクトリをアーカイブに書き込む役割を果たします。sourceそしてfieldKeySetプレゼンテーションのコンテキストから。- Session は、FileStream コンストラクターが Swift System に依存していることを特に指摘しました。Swift System は、強力な型指定を使用して低レベルのシステム コールをラップし、Darwin オーバーレイの元のインターフェイスのエラーが発生しやすい点を減らします。
OSLog の文字列補間と書式設定
(28:11) OSLog は、低オーバーヘッドとプライバシー保護をターゲットとしています。 Swift 5.3 は、コンパイラの最適化によって OSLog を高速化し、文字列補間と書式設定オプションを追加して、ログの書き込みを通常の Swift 文字列に近づけます。
logger.log("\(offerID, align: .left(columns: 10), privacy: .public)")
// Logs "E1Z3F "
logger.log("\(seconds, format: .fixed(precision: 2)) seconds")
// Logs "1.30 seconds"
キーポイント:
privacy: .public明らかにofferIDデフォルトで機密データを保護する統合ログの設計と一致し、一般公開としてマークされています。 -align: .left(columns: 10)後で見やすくするために、ログ内の列のフィールドを揃えます。 -format: .fixed(precision: 2)値を小数点第 2 位までに保ち、手動による文字列の書式設定を避けてください。- プロジェクトがまだ使用中の場合
printオンラインの問題をデバッグするには、この API セットが統合ログへの移行のエントリ ポイントとなります。
ArgumentParser はコマンド ライン ツールを宣言型に保ちます
(29:48) Swift Argument Parser は、新しいオープンソース パッケージです。セッションは同じものを使用しますHelloデモを続行するコマンド: addcountオプションを使用すると、ツールは挨拶を繰り返し出力し、パラメータの検証とヘルプ情報を自動的に取得できます。
// Swift ArgumentParser
import ArgumentParser
@main
struct Hello: ParsableCommand {
@Option(name: .shortAndLong, help: "The number of times to say hello.")
var count: Int = 1
@Argument(help: "The name to greet.")
var name: String
func run() {
for _ in 1...count {
print("Hello, \(name)!")
}
}
}
キーポイント:
@Option(name: .shortAndLong)させてcount短いパラメーター形式と長いパラメーター形式の両方がサポートされています。 -var count: Int = 1型とデフォルト値を同時に宣言すると、引数パーサーはそれに応じてそれらを解析して検証します。 -@Argument引き続き位置パラメータを表し、helpコピーライターは、自動生成されたヘルプ ページに入ります。 -run()ビジネス ロジックのみが保持され、エントリ、パラメーター解析、およびヘルプ画面はすべてパッケージによって処理されます。
重要ポイント
-
やるべきこと: 既存の Swift アプリでサイズとヒープ メモリの回帰チェックを実行します。 実行する価値がある理由: Swift 5.3 のコード サイズ、SwiftUI アプリのロジック サイズ、およびランタイム ヒープ オーバーヘッドはすべて明確に最適化されており、古いプロジェクトはアップグレードの恩恵を直接受けられる可能性があります。 開始方法: 同じコードを使用して古い Xcode と Xcode 12 でそれぞれアーカイブし、バイナリ サイズを比較します。 Instruments で起動後にヒープ メモリを記録します。
-
何をすべきか: 内部スクリプトを Swift Argument Parser コマンド ライン ツールに変更します。 実行する価値がある理由:
@mainそしてParsableCommand入口、パラメータ宣言、ヘルプ情報を1種類にまとめて手書きを軽減main.swiftパラメータ解析コード。 開始方法: 新しい Swift パッケージを作成してインポートしますapple/swift-argument-parser、スクリプトパラメータを次のように分割します。@Optionそして@Argument。 -
何をすべきか: オンライン診断ログ用の OSLog ラッパー レイヤーを作成します。 実行する価値がある理由: Swift 5.3 の OSLog は、文字列補間、プライバシー マーキング、および書式設定をサポートしており、散在する文字列を置き換えることができます。
print、機密情報が漏洩するリスクも軽減できます。 開始方法: 主要なビジネス リンクから開始し、定義しますLogger分類し、デフォルトでユーザー入力を非公開にし、必要な ID のみをマークします。.public。 -
何をすべきか: リソース コンポーネントを Swift パッケージに分割します。 実行する価値がある理由: このセッションでは Swift パッケージのエコロジカル拡張について言及し、関連するセッション 10169 では引き続きリソースとローカリゼーションについて話します。コンポーネント パッケージには、コード、画像、ストーリーボード、ローカライズされた文字列を同時に含めることができます。 開始方法: まずデザインシステムまたは空の状態のコンポーネントパッケージを描画し、 を押します。
Sources、Resourcesそして.processファイルを整理し、アプリ ターゲット内のローカル参照を置き換えます。 -
対処方法: Apple Archive を開発資産パッケージ化ツールとして使用します。 価値がある理由: Apple Archive は、サンプル データ、ログ パッケージ、またはデザイン リソースをトランスポータブル ファイルにアーカイブするための Swift API、LZFSE 圧縮、およびコマンドライン ツールを提供します。 開始方法: セッションを入れる
withFileStream、withCompressionStream、withEncodeStreamこの例は、内部 CLI、入力ディレクトリ、出力に変更されています。.aar。
関連セッション
- バイナリ フレームワークを Swift パッケージとして配布する - Swift パッケージを使用して XCFramework を配布し、バイナリ ターゲットを構成し、チェックサムを使用してクライアントが期待したバイナリを確実に取得できるようにします。
- Swift のロギングを探索する — Swift 統合ロギング API を詳しく調べ、プライバシー保護、文字列補間、書式設定、および低オーバーヘッドのログ収集を理解します。
- Swift で数値コンピューティングを探索する — Swift Numerics、Float16、汎用数値プロトコル、および複素数型を紹介し、このセッションで言及された数値コンピューティング エコシステムを補足します。
- Swift パッケージ: リソースとローカリゼーション — リソース ファイル、画像、ストーリーボード、ローカリゼーション文字列が Swift パッケージでどのように編成されるかを説明します。
- SwiftUI の新機能 — 2020 年の SwiftUI の新しいアプリ、シーン、ウィジェット、アウトライン、グリッド、ツールバーの機能を示します。
コメント
GitHub Issues · utterances