Swift Academy · レッスン

プライマリ関連型と型付きthrows

プロトコル存在型を制約し、Swift 6の型付きエラー伝播を学びます。

レッスン 4/413 ステップ

「プライマリ関連型と型付きthrows」はCoddyKit上の無料Swift Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSwift Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Swift Academyコースには全4レッスンが含まれています。

プライマリ関連型

Swift 5.7では、プロトコルにプライマリ関連型を指定できるため、制約付き存在型を利用できます。

protocol Container<Element> {
  associatedtype Element
  var items: [Element] { get }
}
struct Bag<T>: Container { var items: [T] = [] }

制約付き存在型

プライマリ関連型を使うと、any Containerと記述して存在型を絞り込めます。

func printItems(_ c: any Container<Int>) {
  c.items.forEach { print($0) }
}
printItems(Bag(items: [1,2,3]))

Collectionの制約付き存在型

Collectionなどの標準ライブラリのプロトコルも、プライマリ関連型をサポートするようになりました。

func first(_ c: any Collection<String>) -> String? {
  c.first
}
print(first(["a","b","c"]) ?? "none")

型付きthrowsの概要

Swift 6では型付きthrowsが導入され、関数がスローする可能性のある正確なエラー型を宣言できます。

enum NetworkError: Error { case timeout, notFound }
func fetch() throws(NetworkError) -> Data {
  throw NetworkError.timeout
}

型付きthrowsによる網羅的なcatch

エラー型がわかっているため、コンパイラーはすべてのケースが網羅的に処理されていることを検証できます。

do {
  let _ = try fetch()
} catch .timeout {
  print("Timed out")
} catch .notFound {
  print("Not found")
}

プロトコルでの型付きthrows

プロトコルの要件で型付きthrowsを指定できるため、準拠する型は正確なエラー型を提供できます。

protocol Fetchable {
  associatedtype Failure: Error
  func fetch() throws(Failure) -> Data
}

型付きthrowsによる再スロー

rethrowsは型付きthrowsと連携し、外側の関数が内側のエラー型を伝播します。

func map<T, E: Error>(_ array: [T], transform: (T) throws(E) -> T) throws(E) -> [T] {
  try array.map { try transform($0) }
}

プライマリ関連型と型付きthrowsの組み合わせ

両方の機能を組み合わせて、正確で型安全なAPIを構築できます。

protocol Repository<Model> {
  associatedtype Model
  associatedtype Failure: Error
  func fetchAll() throws(Failure) -> [Model]
}

不透明な型付きthrows

throws(any Error)は型なしthrowsに相当し、柔軟な逃げ道を提供します。

func riskyOp() throws(any Error) {
  // can throw any error
}

移行:型なしthrowsから型付きthrowsへ

移行手順として、既存のthrowing関数に具体的なエラー型を段階的に注釈として追加します。

// Before:
func load() throws -> Data { ... }
// After:
func load() throws(NetworkError) -> Data { ... }

型付きthrowsとasync

型付きthrowsはasyncと自然に組み合わせられます。async throws(E)は有効な構文です。

func fetchAsync() async throws(NetworkError) -> Data {
  throw NetworkError.notFound
}

理解度チェック

プロトコルにプライマリ関連型を指定すると、何が可能になりますか。

レッスンのまとめ

プライマリ関連型(Swift 5.7)により、any Collectionのような制約付き存在型を利用できます。型付きthrows(Swift 6)を使うと、網羅的なcatchブロックのために正確なエラー型を宣言できます。どちらの機能も型安全性とAPIの表現力を高めます。

無料で開始

AI チューターと学ぶ Swift — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
122
レッスン
409

よくある質問

「プライマリ関連型と型付きthrows」レッスンは無料ですか?

はい。「プライマリ関連型と型付きthrows」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Swift Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Swift Academyコースには全4レッスンが含まれています。

「プライマリ関連型と型付きthrows」で何を学びますか?

プロトコル存在型を制約し、Swift 6の型付きエラー伝播を学びます。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Swift Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのSwift Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「プライマリ関連型と型付きthrows」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このSwift Academyレッスンでコードを書いて実行できますか?

はい。すべてのSwift Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. ジェネリック制約とwhere句
  2. someキーワードによる不透明型
  3. anyと型消去による存在型
  4. プライマリ関連型と型付きthrows
← Swift Academyに戻る