diff --git a/language-guide/the-basics.md b/language-guide/the-basics.md index 92702eef..93165318 100644 --- a/language-guide/the-basics.md +++ b/language-guide/the-basics.md @@ -1,6 +1,6 @@ # 基本\(The Basics\) -最終更新日: 2023/12/29 +最終更新日: 2025/5/17 原文: https://docs.swift.org/swift-book/LanguageGuide/TheBasics.html 一般的な種類のデータを操作し、基本的な構文を記述する。 @@ -12,9 +12,11 @@ Swift は、名前を特定して、値を保持したり、その値を参照 これまで見たことがあるような型に加え、Swift はタプルのような、より応用的な型を導入します。タプルは値を 1 つのグループとして扱うことができます。タプルを使用すると、複数の値を 1 つの値の組み合わせとして関数から返すことができます。 -Swift は値が存在しないかもしれない値を扱うオプショナル型を導入しています。オプショナルは、「値が存在していて、これは x と等しい」もしくは「値は一切存在しない」ということを表します。 +Swift はオプショナル型を使って値が存在しないことを処理します。オプショナルは、「値が存在していて、これは x である」もしくは「値は存在しない」ということを表します。 +オプショナルは、値を使用する前にその値が存在するかどうかを常に確認し、非オプショナルは必ず値が存在することを保証します。 -Swift は_型安全_な言語です。つまり、言語として、コードで扱う値の型を明確にしてくれます。例えば、`String` が必要な場合に、この型安全な特徴が、間違って `Int` を渡してしまうことを防いでくれます。同様に、オプショナルではない `String` にオプショナルの `String` を誤って渡してしまうことも防いでくれます。型安全なことで、開発中に、素早くエラーの発見と修正をすることができます。 +Swift は安全な言語であり、開発プロセスの早い段階でさまざまな種類のバグを発見し、修正しやすくし、特定の種類のバグが発生しないことを保証できます。この型安全性により、コードが扱う値の型を明確にできます。たとえば、コードの一部が `String` を必要とする場合、型安全性によって誤って `Int` を渡すことはできません。 +メモリ安全性により、有効なデータのみを扱い、初期化されていないメモリや解放済みのオブジェクトを利用することがなくなります。また、そのデータに安全な方法でアクセスすることが保証されます。たとえ複数のコードが同時に実行されるプログラムであってもです。Swift は、ほとんどの安全性チェックをコードのビルド時に行い、一部のケースではコード実行中にも追加のチェックを行います。 ## 定数と変数\(Constants and Variables\) @@ -232,9 +234,9 @@ Swift は符号なしの整数値型も提供しています。これも、プ ## 型安全と型推論\(Type Safety and Type Inference\) -Swift は_型安全_な言語です。型安全な言語は、扱っている値の型を明確にします。`String` が必要な場合に、間違って `Int` を渡すようなことはありません。 +Swift のプログラムにおけるすべての値には型があります。値を保存するすべての場所(定数、変数、プロパティを含む)にも型があります。型アノテーションを使って明示的に型を記述することもできますし、Swift が初期値から型を推論することもあります。コード内で値を渡す場所ごとに、その値の型と使用する場所の型は一致しなければなりません。たとえば、コードの一部で `String` 型が必要な場合、誤って `Int` 型を渡すことはできません。このような型のチェック機構により、Swift は型安全な言語となっています。 -型安全なことから、コンパイル時に型チェックが行われ、間違った型に対してはエラーを示します。これによって開発時に素早くエラーに気がつき修正をすることができます。 +型安全な言語は、コードが操作する値の型について明確にすることを促します。ある型の値が別の型に暗黙的に変換されることはありません。ただし、一部の型は明示的に変換することができます。コードを作成する際、Swift は型の安全性をチェックし、不一致があればエラーとして表示します。 型チェックによって、異なる型の値を扱う場合に間違った型を代入してしまうエラーを回避することができます。しかし、全ての定数と変数の定義時に型を特定しなければならないということではありません。特定しない場合、Swift は適切な型への推論を行います。コンパイラがコンパイル時に与えられた値を調べることで、式の型を自動で推論してくれます。 @@ -715,6 +717,21 @@ if let definiteString = assumedString { // An implicitly unwrapped optional string. ``` +## メモリ安全性\(Memory Safety\) + +型の不一致を防ぐチェックについては [型安全と型推論](#型安全と型推論type-safety-and-type-inference) で説明しましたが、Swift はそれに加えて、無効なメモリ操作からもコードを守ります。この保護は*メモリ安全性*と呼ばれ、以下の要件が含まれます。 + +- 値は読み取る前に設定されている。未初期化のメモリ領域とのやり取りを防ぐこの保護は、*確定初期化*とも呼ばれる +- 配列やバッファは有効なインデックスでのみアクセスされる。範囲外アクセスから保護するこの仕組みは、*境界安全性*とも呼ばれる +- メモリへのアクセスは値のライフタイム中のみ行われる。解放後のメモリ使用を防ぐこの保護は、*ライフタイム安全性*とも呼ばれる +- メモリへの重複アクセスは、安全であると証明できる場合に限られる。並行コードでのデータ競合を防ぐこの仕組みは、*スレッド安全性*とも呼ばれる + +これらの保証を提供しない言語で開発した経験があれば、上記のリストで挙げたエラーやバグに馴染みがあるかもしれません。これらの問題に遭遇していない場合は問題ありません。Swift で安全なコードを書けば、これらの問題は回避できます。Swift が初期値の設定をどのように保証するかについては [初期化](./initialization.md)、並行コードでのメモリ安全性のチェックに関しては[並行処理](./concurrency.md)、メモリへの重複アクセスの確認については[メモリ安全性](./memory-safety.md)をご覧ください。 + +時には、安全性の範囲外で作業する必要が出てくる場合もあります。たとえば、言語や標準ライブラリの制限による場合などです。そのため Swift では、一部の API に対して「unsafe」「unchecked」「unmanaged」などの語を含む型やメソッドとして、安全でないバージョンも提供しています。こうした型やメソッドを使う際は、安全性の責任を自分で負うことになります。 + +Swift で安全なコードを書いても、エラーや予期しない失敗が発生し、プログラムの実行が停止してしまうことがあります。安全性は、必ずしもコードが最後まで正常に動作することを保証するものではありません。Swift では、[エラーハンドリング](#エラーハンドリングerror-handling)や[アサーションと事前条件](#アサーションと事前条件assertions-and-preconditions)で説明されているように、エラーを通知し回復するためのいくつかの方法を提供しています。しかし状況によっては、エラーを安全に処理する唯一の方法が、実行を停止することである場合もあります。サービスが予期せず停止しないことを保証する必要がある場合は、そのアーキテクチャ全体にフォールトトレランス(障害耐性)を組み込んで、どのコンポーネントが予期せず停止しても回復できるようにしてください。 + ## エラーハンドリング\(Error Handling\) 実行中のエラーに対応するためには、_エラーハンドリング_を行います。