宣言
日本語を消す 英語を消す下記URLから引用し、日本語訳をつけてみました
https://docs.swift.org/swift-book/documentation/the-swift-programming-language/declarations
Introduce types, operators, variables, and other names and constructs.
型、演算子、変数、その他の名前と構成要素を紹介します。
A declaration introduces a new name or construct into your program. For example, you use declarations to introduce functions and methods, to introduce variables and constants, and to define enumeration, structure, class, and protocol types. You can also use a declaration to extend the behavior of an existing named type and to import symbols into your program that are declared elsewhere.
宣言は、プログラムに新しい名前または構造を導入します。 たとえば、宣言を使用して関数やメソッドを導入したり、変数や定数を導入したり、列挙型、構造体、クラス、プロトコル型を定義したりできます。 宣言を使用して、既存の名前付き型の動作を拡張したり、他の場所で宣言されたシンボルをプログラムにインポートしたりすることもできます。
In Swift, most declarations are also definitions in the sense that they’re implemented or initialized at the same time they’re declared. That said, because protocols don’t implement their members, most protocol members are declarations only. For convenience and because the distinction isn’t that important in Swift, the term declaration covers both declarations and definitions.
Swift では、ほとんどの宣言は、宣言と同時に実装または初期化されるという意味で定義でもあります。 とはいえ、プロトコルはメンバーを実装していないため、ほとんどのプロトコル メンバーは宣言のみです。 便宜上、また Swift ではこの区別はそれほど重要ではないため、「宣言」という用語は宣言と定義の両方を指します。
Grammar of a declaration
declaration → import-declaration
declaration → constant-declaration
declaration → variable-declaration
declaration → typealias-declaration
declaration → function-declaration
declaration → enum-declaration
declaration → struct-declaration
declaration → class-declaration
declaration → actor-declaration
declaration → protocol-declaration
declaration → initializer-declaration
declaration → deinitializer-declaration
declaration → extension-declaration
declaration → subscript-declaration
declaration → macro-declaration
declaration → operator-declaration
declaration → precedence-group-declaration \
Top-Level Code
トップレベルのコード
The top-level code in a Swift source file consists of zero or more statements, declarations, and expressions. By default, variables, constants, and other named declarations that are declared at the top-level of a source file are accessible to code in every source file that’s part of the same module. You can override this default behavior by marking the declaration with an access-level modifier, as described in Access Control Levels.
Swift ソース ファイルのトップレベル コードは、0 個以上のステートメント、宣言、式で構成されます。 デフォルトでは、ソース ファイルのトップレベルで宣言されている変数、定数、およびその他の名前付き宣言は、同じモジュールの一部であるすべてのソース ファイルのコードからアクセスできます。 「アクセス制御レベル」で説明されているように、宣言にアクセスレベル修飾子をマークすることで、このデフォルトの動作をオーバーライドできます。
There are two kinds of top-level code: top-level declarations and executable top-level code. Top-level declarations consist of only declarations, and are allowed in all Swift source files. Executable top-level code contains statements and expressions, not just declarations, and is allowed only as the top-level entry point for the program.
トップレベル コードには、トップレベル宣言と実行可能なトップレベル コードの 2 種類があります。 最上位の宣言は宣言のみで構成され、すべての Swift ソース ファイルで許可されます。 実行可能なトップレベル コードには、宣言だけでなくステートメントと式が含まれており、プログラムのトップレベル エントリ ポイントとしてのみ許可されます。
The Swift code you compile to make an executable can contain at most one of the following approaches to mark the top-level entry point, regardless of how the code is organized into files and modules: the main
attribute, the NSApplicationMain
attribute, the UIApplicationMain
attribute, a main.swift
file, or a file that contains top-level executable code.
実行可能ファイルを作成するためにコンパイルする Swift コードには、コードがファイルやモジュールにどのように編成されているかに関係なく、トップレベルのエントリ ポイントをマークするための次のアプローチの最大 1 つを含めることができます: main
属性、NSApplicationMain
属性、UIApplicationMain
属性 、main.swift
ファイル、または最上位の実行可能コードを含むファイル。
Grammar of a top-level declaration
top-level-declaration → statements?
Code Blocks
コードブロック
A code block is used by a variety of declarations and control structures to group statements together. It has the following form:
コード ブロックは、ステートメントをグループ化するためにさまざまな宣言や制御構造によって使用されます。 次のような形式になります。
{
<#statements#>
}
The statements inside a code block include declarations, expressions, and other kinds of statements and are executed in order of their appearance in source code.
コード ブロック内のステートメントには、宣言、式、その他の種類のステートメントが含まれており、ソース コード内での出現順に実行されます。
Grammar of a code block
code-block → {
statements? }
Import Declaration
インポート宣言
An import declaration lets you access symbols that are declared outside the current file. The basic form imports the entire module; it consists of the import
keyword followed by a module name:
インポート宣言を使用すると、現在のファイルの外部で宣言されているシンボルにアクセスできます。 基本的な形式はモジュール全体をインポートします。 これは、import
キーワードとその後に続くモジュール名で構成されます。
import <#module#>
Providing more detail limits which symbols are imported — you can specify a specific submodule or a specific declaration within a module or submodule. When this detailed form is used, only the imported symbol (and not the module that declares it) is made available in the current scope.
さらに詳細を指定すると、インポートされるシンボルが制限されます。特定のサブモジュール、またはモジュールまたはサブモジュール内の特定の宣言を指定できます。 この詳細な形式を使用すると、インポートされたシンボルのみ (それを宣言するモジュールではなく) が現在のスコープで使用可能になります。
import <#import kind#> <#module#>.<#symbol name#>
import <#module#>.<#submodule#>
Grammar of an import declaration
import-declaration → attributes? import
import-kind? import-path
import-kind → typealias
| struct
| class
| enum
| protocol
| let
| var
| func
import-path → identifier | identifier .
import-path
Constant Declaration
定数の宣言
A constant declaration introduces a constant named value into your program. Constant declarations are declared using the let
keyword and have the following form:
定数宣言は、不変の名前付き値をプログラムに導入します。 定数の宣言は let
キーワードを使用して宣言され、次の形式になります。
let <#constant name#>: <#type#> = <#expression#>
A constant declaration defines an immutable binding between the constant name and the value of the initializer expression; after the value of a constant is set, it can’t be changed. That said, if a constant is initialized with a class object, the object itself can change, but the binding between the constant name and the object it refers to can’t.
定数宣言は、定数名と初期化子式の値の間の不変のバインディングを定義します。 定数の値を設定した後は変更できません。 つまり、定数がクラス オブジェクトで初期化された場合、オブジェクト自体は変更できますが、定数名とそれが参照するオブジェクトの間のバインディングは変更できません。
When a constant is declared at global scope, it must be initialized with a value. When a constant declaration occurs in the context of a function or method, it can be initialized later, as long as it’s guaranteed to have a value set before the first time its value is read. If the compiler can prove that the constant’s value is never read, the constant isn’t required to have a value set at all. This analysis is called definite initialization — the compiler proves that a value is definitely set before being read.
定数がグローバル スコープで宣言されている場合は、値を使用して初期化する必要があります。 関数またはメソッドのコンテキストで定数宣言が発生した場合、最初に値が読み取られる前に値が設定されていることが保証されている限り、後で初期化することができます。 コンパイラが定数の値が決して読み取られないことを証明できれば、定数に値を設定する必要はまったくありません。 この分析は、明確な初期化と呼ばれます。コンパイラーは、値が読み取られる前に、値が確実に設定されていることを証明します。
Note
注釈
Definite initialization can’t construct proofs that require domain knowledge, and its ability to track state across conditionals has a limit. If you can determine that constant always has a value set, but the compiler can’t prove this is the case, try simplifying the code paths that set the value, or use a variable declaration instead.
確定初期化では、ドメインの知識を必要とする証明を構築できず、条件分岐全体で状態を追跡する能力には限界があります。 定数には常に値が設定されていると判断できても、コンパイラがそれを証明できない場合は、値を設定するコード パスを簡略化するか、代わりに変数宣言を使用してください。
When a constant declaration occurs in the context of a class or structure declaration, it’s considered a constant property. Constant declarations aren’t computed properties and therefore don’t have getters or setters.
クラスまたは構造体宣言のコンテキストで定数宣言が発生すると、それは定数プロパティとみなされます。 定数宣言は計算プロパティではないため、ゲッターやセッターはありません。
If the constant name of a constant declaration is a tuple pattern, the name of each item in the tuple is bound to the corresponding value in the initializer expression.
定数宣言の定数名がタプル パターンの場合、タプル内の各項目の名前は、初期化子式内の対応する値にバインドされます。
let (firstNumber, secondNumber) = (10, 42)
In this example, firstNumber
is a named constant for the value 10
, and secondNumber
is a named constant for the value 42
. Both constants can now be used independently:
この例では、firstNumber
は値 10
の名前付き定数であり、secondNumber
は値 42
の名前付き定数です。両方の定数を独立して使用できるようになりました。
print("The first number is \(firstNumber).")
// Prints "The first number is 10."
print("The second number is \(secondNumber).")
// Prints "The second number is 42."
The type annotation (:
type) is optional in a constant declaration when the type of the constant name can be inferred, as described in Type Inference.
「型推論」で説明されているように、定数名の型が推論できる場合、型アノテーション (:
type) は定数宣言でのオプションです。
To declare a constant type property, mark the declaration with the static
declaration modifier. A constant type property of a class is always implicitly final; you can’t mark it with the class
or final
declaration modifier to allow or disallow overriding by subclasses. Type properties are discussed in Type Properties.
定数型のプロパティを宣言するには、宣言を static
宣言修飾子でマークします。 クラスの定数型プロパティは常に暗黙的に final になります。 class
またはfinal
宣言修飾子でマークして、サブクラスによるオーバーライドを許可または禁止することはできません。 型プロパティについては、「型 プロパティ」で説明します。
For more information about constants and for guidance about when to use them, see Constants and Variables and Stored Properties.
定数の詳細と定数を使用する場合のガイダンスについては、「定数と変数」および「保存されたプロパティ」を参照してください。
Grammar of a constant declaration
constant-declaration → attributes? declaration-modifiers? let
pattern-initializer-list
pattern-initializer-list → pattern-initializer | pattern-initializer ,
pattern-initializer-list
pattern-initializer → pattern initializer?
initializer → =
expression
Variable Declaration
変数の宣言
A variable declaration introduces a variable named value into your program and is declared using the var
keyword.
変数宣言は、変更可能な名前付きの値をプログラムに導入し、var
キーワードを使用して宣言します。
Variable declarations have several forms that declare different kinds of named, mutable values, including stored and computed variables and properties, stored variable and property observers, and static variable properties. The appropriate form to use depends on the scope at which the variable is declared and the kind of variable you intend to declare.
変数宣言には、保存および計算された変数とプロパティ、保存された変数とプロパティのオブザーバー、静的変数のプロパティなど、さまざまな種類の名前付き変更可能な値を宣言するいくつかの形式があります。 使用する適切な形式は、変数が宣言されるスコープと、宣言する予定の変数の種類によって異なります。
Note
注釈
You can also declare properties in the context of a protocol declaration, as described in Protocol Property Declaration.
「 プロトコル プロパティの宣言」で説明されているように、プロトコル宣言のコンテキストでプロパティを宣言することもできます。
You can override a property in a subclass by marking the subclass’s property declaration with the override
declaration modifier, as described in Overriding.
「オーバーライド」で説明されているように、サブクラスのプロパティ宣言をoverride
宣言修飾子でマークすることで、サブクラス内のプロパティをオーバーライドできます。
Stored Variables and Stored Variable Properties
保存された変数と保存された変数のプロパティ
The following form declares a stored variable or stored variable property:
次の形式は、保存された変数または保存された変数のプロパティを宣言します。
var <#variable name#>: <#type#> = <#expression#>
You define this form of a variable declaration at global scope, the local scope of a function, or in the context of a class or structure declaration. When a variable declaration of this form is declared at global scope or the local scope of a function, it’s referred to as a stored variable. When it’s declared in the context of a class or structure declaration, it’s referred to as a stored variable property.
この形式の変数宣言は、グローバル スコープ、関数のローカル スコープ、またはクラスまたは構造体宣言のコンテキストで定義します。 この形式の変数宣言が関数のグローバル スコープまたはローカル スコープで宣言されている場合、その変数はストアド変数と呼ばれます。 クラスまたは構造体の宣言のコンテキストで宣言される場合、これはストアド変数プロパティと呼ばれます。
The initializer expression can’t be present in a protocol declaration, but in all other contexts, the initializer expression is optional. That said, if no initializer expression is present, the variable declaration must include an explicit type annotation (:
type).
イニシャライザ式はプロトコル宣言に存在できませんが、他のすべてのコンテキストではイニシャライザ式はオプションです。 ただし、初期化子式が存在しない場合は、変数宣言に明示的な型アノテーション (:
type) を含める必要があります。
As with constant declarations, if a variable declaration omits the initializer expression, the variable must have a value set before the first time it is read. Also like constant declarations, if the variable name is a tuple pattern, the name of each item in the tuple is bound to the corresponding value in the initializer expression.
定数宣言と同様に、変数宣言でイニシャライザ式が省略されている場合、変数には最初に読み取られる前に値が設定されている必要があります。 また、定数宣言と同様に、変数名がタプル パターンの場合、タプル内の各項目の名前は、イニシャライザ式内の対応する値にバインドされます。
As their names suggest, the value of a stored variable or a stored variable property is stored in memory.
名前が示すように、保存された変数または保存された変数のプロパティの値はメモリに保存されます。
Computed Variables and Computed Properties
計算された変数と計算されたプロパティ
The following form declares a computed variable or computed property:
次の形式は、計算変数または計算プロパティを宣言します。
var <#variable name#>: <#type#> {
get {
<#statements#>
}
set(<#setter name#>) {
<#statements#>
}
}
You define this form of a variable declaration at global scope, the local scope of a function, or in the context of a class, structure, enumeration, or extension declaration. When a variable declaration of this form is declared at global scope or the local scope of a function, it’s referred to as a computed variable. When it’s declared in the context of a class, structure, or extension declaration, it’s referred to as a computed property.
この形式の変数宣言は、グローバル スコープ、関数のローカル スコープ、またはクラス、構造体、列挙、または拡張宣言のコンテキストで定義します。 この形式の変数宣言が関数のグローバル スコープまたはローカル スコープで宣言されている場合、それは計算変数と呼ばれます。 クラス、構造体、または拡張機能の宣言のコンテキストで宣言される場合、それは計算プロパティと呼ばれます。
The getter is used to read the value, and the setter is used to write the value. The setter clause is optional, and when only a getter is needed, you can omit both clauses and simply return the requested value directly, as described in Read-Only Computed Properties. But if you provide a setter clause, you must also provide a getter clause.
ゲッターは値の読み取りに使用され、セッターは値の書き込みに使用されます。 setter 句はオプションであり、getter のみが必要な場合は、読み取り専用の計算されたプロパティで説明されているように、両方の句を省略して、単純に要求された値を直接返すことができます。 ただし、setter 句を指定する場合は、getter 句も指定する必要があります。
The setter name and enclosing parentheses is optional. If you provide a setter name, it’s used as the name of the parameter to the setter. If you don’t provide a setter name, the default parameter name to the setter is newValue
, as described in Shorthand Setter Declaration.
セッター名と括弧はオプションです。 セッター名を指定すると、それがセッターへのパラメーターの名前として使用されます。 セッター名を指定しない場合、「短縮セッター宣言」で説明されているように、セッターのデフォルトのパラメータ名は newValue
になります。
Unlike stored named values and stored variable properties, the value of a computed named value or a computed property isn’t stored in memory.
保存された名前付き値や保存された変数プロパティとは異なり、計算された名前付き値や計算されたプロパティの値はメモリに保存されません。
For more information and to see examples of computed properties, see Computed Properties.
計算されたプロパティの詳細と例を確認するには、「計算されたプロパティ」を参照してください。
Stored Variable Observers and Property Observers
ストアド(保存された)変数オブザーバーとプロパティ オブザーバー
You can also declare a stored variable or property with willSet
and didSet
observers. A stored variable or property declared with observers has the following form:
willSet
および didSet
オブザーバーを使用して、保存された変数またはプロパティを宣言することもできます。 オブザーバーで宣言されたストアド変数またはプロパティは次の形式になります。
var <#variable name#>: <#type#> = <#expression#> {
willSet(<#setter name#>) {
<#statements#>
}
didSet(<#setter name#>) {
<#statements#>
}
}
You define this form of a variable declaration at global scope, the local scope of a function, or in the context of a class or structure declaration. When a variable declaration of this form is declared at global scope or the local scope of a function, the observers are referred to as stored variable observers. When it’s declared in the context of a class or structure declaration, the observers are referred to as property observers.
この形式の変数宣言は、グローバル スコープ、関数のローカル スコープ、またはクラスまたは構造体宣言のコンテキストで定義します。 この形式の変数宣言が関数のグローバル スコープまたはローカル スコープで宣言されている場合、オブザーバーはストアド変数オブザーバーと呼ばれます。 クラスまたは構造体の宣言のコンテキストで宣言されている場合、オブザーバーはプロパティ オブザーバーと呼ばれます。
You can add property observers to any stored property. You can also add property observers to any inherited property (whether stored or computed) by overriding the property within a subclass, as described in Overriding Property Observers.
プロパティ オブザーバーは、保存されているプロパティに追加できます。 「プロパティ オブザーバーのオーバーライド」で説明されているように、サブクラス内でプロパティをオーバーライドすることで、継承されたプロパティ (保存されたプロパティか計算されたプロパティかに関係なく) にプロパティ オブザーバーを追加することもできます。
The initializer expression is optional in the context of a class or structure declaration, but required elsewhere. The type annotation is optional when the type can be inferred from the initializer expression. This expression is evaluated the first time you read the property’s value. If you overwrite the property’s initial value without reading it, this expression is evaluated before the first time you write to the property.
イニシャライザ式は、クラスまたは構造体の宣言のコンテキストではオプションですが、他の場所では必須です。 型がイニシャライザ式から推測できる場合、型アノテーションはオプションです。 この式は、プロパティの値を初めて読み取るときに評価されます。 プロパティの初期値を読み取らずに上書きした場合、この式はプロパティに初めて書き込む前に評価されます。
The willSet
and didSet
observers provide a way to observe (and to respond appropriately) when the value of a variable or property is being set. The observers aren’t called when the variable or property is first initialized. Instead, they’re called only when the value is set outside of an initialization context.
willSet
オブザーバーと didSet
オブザーバーは、変数またはプロパティの値が設定されるときを観察する (そして適切に応答する) 方法を提供します。 変数またはプロパティが最初に初期化されるとき、オブザーバーは呼び出されません。 代わりに、値が初期化コンテキストの外で設定された場合にのみ呼び出されます。
A willSet
observer is called just before the value of the variable or property is set. The new value is passed to the willSet
observer as a constant, and therefore it can’t be changed in the implementation of the willSet
clause. The didSet
observer is called immediately after the new value is set. In contrast to the willSet
observer, the old value of the variable or property is passed to the didSet
observer in case you still need access to it. That said, if you assign a value to a variable or property within its own didSet
observer clause, that new value that you assign will replace the one that was just set and passed to the willSet
observer.
willSet
オブザーバーは、変数またはプロパティの値が設定される直前に呼び出されます。 新しい値は定数として willSet
オブザーバーに渡されるため、willSet
句の実装では変更できません。 新しい値が設定された直後に、didSet
オブザーバーが呼び出されます。 willSet
オブザーバーとは対照的に、アクセスが必要な場合に備えて、変数またはプロパティの古い値が didSet
オブザーバーに渡されます。 ただし、独自の didSet
オブザーバー句内で変数またはプロパティに値を割り当てると、割り当てた新しい値が、設定されて willSet
オブザーバーに渡されたばかりの値を置き換えます。
The setter name and enclosing parentheses in the willSet
and didSet
clauses are optional. If you provide setter names, they’re used as the parameter names to the willSet
and didSet
observers. If you don’t provide setter names, the default parameter name to the willSet
observer is newValue
and the default parameter name to the didSet
observer is oldValue
.
willSet
句とdidSet
句内のセッター名と括弧はオプションです。 セッター名を指定すると、それらは willSet
オブザーバーと didSet
オブザーバーへのパラメーター名として使用されます。 セッター名を指定しない場合、willSet
オブザーバーのデフォルトのパラメータ名は newValue
、didSet
オブザーバーのデフォルトのパラメータ名は oldValue
になります。
The didSet
clause is optional when you provide a willSet
clause. Likewise, the willSet
clause is optional when you provide a didSet
clause.
willSet
句を指定する場合、didSet
句はオプションです。 同様に、didSet
句を指定する場合、willSet
句はオプションです。
If the body of the didSet
observer refers to the old value, the getter is called before the observer, to make the old value available. Otherwise, the new value is stored without calling the superclass’s getter. The example below shows a computed property that’s defined by the superclass and overridden by its subclasses to add an observer.
didSet
オブザーバーの本体が古い値を参照している場合、オブザーバーの前にゲッターが呼び出され、古い値が使用可能になります。 それ以外の場合、新しい値はスーパークラスのゲッターを呼び出さずに保存されます。 以下の例は、スーパークラスによって定義され、サブクラスによってオーバーライドされてオブザーバーを追加する計算プロパティを示しています。
class Superclass {
private var xValue = 12
var x: Int {
get { print("Getter was called"); return xValue }
set { print("Setter was called"); xValue = newValue }
}
}
// This subclass doesn't refer to oldValue in its observer, so the
// superclass's getter is called only once to print the value.
class New: Superclass {
override var x: Int {
didSet { print("New value \(x)") }
}
}
let new = New()
new.x = 100
// Prints "Setter was called"
// Prints "Getter was called"
// Prints "New value 100"
// This subclass refers to oldValue in its observer, so the superclass's
// getter is called once before the setter, and again to print the value.
class NewAndOld: Superclass {
override var x: Int {
didSet { print("Old value \(oldValue) - new value \(x)") }
}
}
let newAndOld = NewAndOld()
newAndOld.x = 200
// Prints "Getter was called"
// Prints "Setter was called"
// Prints "Getter was called"
// Prints "Old value 12 - new value 200"
For more information and to see an example of how to use property observers, see Property Observers.
詳細とプロパティ オブザーバーの使用例については、「プロパティ オブザーバー」を参照してください。
Type Variable Properties
型変数プロパティ
To declare a type variable property, mark the declaration with the static
declaration modifier. Classes can mark type computed properties with the class
declaration modifier instead to allow subclasses to override the superclass’s implementation. Type properties are discussed in Type Properties.
型変数プロパティを宣言するには、宣言を static
宣言修飾子でマークします。 クラスは、代わりにクラス宣言修飾子を使用して型計算プロパティをマークし、サブクラスがスーパークラスの実装をオーバーライドできるようにすることができます。 型プロパティについては、「 型プロパティ」で説明します。
Grammar of a variable declaration
variable-declaration → variable-declaration-head pattern-initializer-list
variable-declaration → variable-declaration-head variable-name type-annotation code-block
variable-declaration → variable-declaration-head variable-name type-annotation getter-setter-block
variable-declaration → variable-declaration-head variable-name type-annotation getter-setter-keyword-block
variable-declaration → variable-declaration-head variable-name initializer willSet-didSet-block
variable-declaration → variable-declaration-head variable-name type-annotation initializer? willSet-didSet-block
variable-declaration-head → attributes? declaration-modifiers? var
variable-name → identifier
getter-setter-block → code-block
getter-setter-block → {
getter-clause setter-clause? }
getter-setter-block → {
setter-clause getter-clause }
getter-clause → attributes? mutation-modifier? get
code-block
setter-clause → attributes? mutation-modifier? set
setter-name? code-block
setter-name → (
identifier )
getter-setter-keyword-block → {
getter-keyword-clause setter-keyword-clause? }
getter-setter-keyword-block → {
setter-keyword-clause getter-keyword-clause }
getter-keyword-clause → attributes? mutation-modifier? get
setter-keyword-clause → attributes? mutation-modifier? set
willSet-didSet-block → {
willSet-clause didSet-clause? }
willSet-didSet-block → {
didSet-clause willSet-clause? }
willSet-clause → attributes? will
setter-name? code-block
didSet-clause → attributes? did
setter-name? code-block
Type Alias Declaration
型エイリアス(別名)の宣言
A type alias declaration introduces a named alias of an existing type into your program. Type alias declarations are declared using the typealias
keyword and have the following form:
型エイリアス宣言は、既存の型の名前付きエイリアスをプログラムに導入します。 型エイリアスの宣言は、typealias
キーワードを使用して宣言され、次の形式になります。
typealias <#name#> = <#existing type#>
After a type alias is declared, the aliased name can be used instead of the existing type everywhere in your program. The existing type can be a named type or a compound type. Type aliases don’t create new types; they simply allow a name to refer to an existing type.
型エイリアスを宣言すると、プログラム内のあらゆる場所で既存の型の代わりにエイリアス名を使用できます。 既存の型は、名前付き型または複合型にすることができます。 型エイリアスは新しい型を作成しません。 単に名前が既存の型を参照できるようにするだけです。
A type alias declaration can use generic parameters to give a name to an existing generic type. The type alias can provide concrete types for some or all of the generic parameters of the existing type. For example:
型の別名宣言では、ジェネリック パラメーターを使用して、既存のジェネリック型に名前を付けることができます。 型エイリアスは、既存の型のジェネリック パラメーターの一部またはすべてに具象型を提供できます。 例えば:
typealias StringDictionary<Value> = Dictionary<String, Value>
// The following dictionaries have the same type.
var dictionary1: StringDictionary<Int> = [:]
var dictionary2: Dictionary<String, Int> = [:]
When a type alias is declared with generic parameters, the constraints on those parameters must match exactly the constraints on the existing type’s generic parameters. For example:
型のエイリアスがジェネリック パラメーターを使用して宣言されている場合、それらのパラメーターの制約は、既存の型のジェネリック パラメーターの制約と正確に一致する必要があります。 例えば:
typealias DictionaryOfInts<Key: Hashable> = Dictionary<Key, Int>
Because the type alias and the existing type can be used interchangeably, the type alias can’t introduce additional generic constraints.
型エイリアスと既存の型は互換的に使用できるため、型エイリアスによって追加の汎用制約を導入することはできません。
A type alias can forward an existing type’s generic parameters by omitting all generic parameters from the declaration. For example, the Diccionario
type alias declared here has the same generic parameters and constraints as Dictionary
.
型エイリアスは、宣言からすべてのジェネリック パラメーターを省略することで、既存の型のジェネリック パラメーターを転送できます。 たとえば、ここで宣言されている Diccionario
型のエイリアスには、Dictionary
と同じ汎用パラメータと制約があります。
typealias Diccionario = Dictionary
Inside a protocol declaration, a type alias can give a shorter and more convenient name to a type that’s used frequently. For example:
プロトコル宣言内で、型エイリアスを使用すると、頻繁に使用される型に短くて便利な名前を付けることができます。 例えば:
protocol Sequence {
associatedtype Iterator: IteratorProtocol
typealias Element = Iterator.Element
}
func sum<T: Sequence>(_ sequence: T) -> Int where T.Element == Int {
// ...
}
Without this type alias, the sum
function would have to refer to the associated type as T.Iterator.Element
instead of T.Element
.
この型エイリアスがないと、sum
関数は関連する型を T.Element
ではなく T.Iterator.Element
として参照する必要があります。
See also Protocol Associated Type Declaration.
「プロトコル関連型の宣言」も参照してください。
Grammar of a type alias declaration
typealias-declaration → attributes? access-level-modifier? typealias
typealias-name generic-parameter-clause? typealias-assignment
typealias-name → identifier
typealias-assignment → =
type
Function Declaration
関数の宣言
A function declaration introduces a function or method into your program. A function declared in the context of class, structure, enumeration, or protocol is referred to as a method. Function declarations are declared using the func
keyword and have the following form:
関数の宣言は、プログラムに関数またはメソッドを導入します。 クラス、構造、列挙、またはプロトコルのコンテキストで宣言された関数は、メソッドと呼ばれます。 関数宣言は func
キーワードを使用して宣言され、次の形式になります。
func <#function name#>(<#parameters#>) -> <#return type#> {
<#statements#>
}
If the function has a return type of Void
, the return type can be omitted as follows:
関数の戻り値の型が Void
の場合、次のように戻り値の型を省略できます。
func <#function name#>(<#parameters#>) {
<#statements#>
}
The type of each parameter must be included — it can’t be inferred. If you write inout
in front of a parameter’s type, the parameter can be modified inside the scope of the function. In-out parameters are discussed in detail in In-Out Parameters, below.
各パラメータの型を含める必要がありますが、推測することはできません。 パラメータの型の前に inout
を記述すると、関数のスコープ内でパラメータを変更できます。 In-out パラメータについては、以下の「入出力パラメータ」で詳しく説明します。
A function declaration whose statements include only a single expression is understood to return the value of that expression. This implicit return syntax is considered only when the expression’s type and the function’s return type aren’t Void
and aren’t an enumeration like Never
that doesn’t have any cases.
ステートメントに 1 つの式のみが含まれる関数宣言は、その式の値を返すものとみなされます。 この暗黙的な戻り構文は、式の型と関数の戻り値の型が Void
ではなく、ケースを持たない Never
のような列挙型でもない場合にのみ考慮されます。
Functions can return multiple values using a tuple type as the return type of the function.
関数は、関数の戻り値の型としてタプル型を使用して、複数の値を返すことができます。
A function definition can appear inside another function declaration. This kind of function is known as a nested function.
関数定義は、別の関数宣言の中に記述することができます。 この種の関数は、ネストされた関数として知られています。
A nested function is nonescaping if it captures a value that’s guaranteed to never escape — such as an in-out parameter — or passed as a nonescaping function argument. Otherwise, the nested function is an escaping function.
ネストされた関数は、決してエスケープしないことが保証されている値 (in-out パラメーターなど) をキャプチャする場合、または非エスケープ関数の引数として渡される場合、非エスケープ関数です。 それ以外の場合、入れ子関数はエスケープ関数になります。
For a discussion of nested functions, see Nested Functions.
ネストされた関数の詳細については、「ネストされた関数」を参照してください。
Parameter Names
パラメーター名
Function parameters are a comma-separated list where each parameter has one of several forms. The order of arguments in a function call must match the order of parameters in the function’s declaration. The simplest entry in a parameter list has the following form:
関数パラメータはカンマ区切りのリストで、各パラメータは複数の形式のいずれかになります。 関数呼び出し内の引数の順序は、関数宣言内のパラメータの順序と一致する必要があります。 パラメータ リストの最も単純なエントリは次の形式になります。
<#parameter name#>: <#parameter type#>
A parameter has a name, which is used within the function body, as well as an argument label, which is used when calling the function or method. By default, parameter names are also used as argument labels. For example:
パラメーターには、関数本体内で使用される名前と、関数またはメソッドを呼び出すときに使用される引数ラベルがあります。 デフォルトでは、パラメータ名は引数ラベルとしても使用されます。 例えば:
func f(x: Int, y: Int) -> Int { return x + y }
f(x: 1, y: 2) // both x and y are labeled
You can override the default behavior for argument labels with one of the following forms:
次の形式のいずれかを使用して、引数ラベルのデフォルトの動作をオーバーライドできます。
<#argument label#> <#parameter name#>: <#parameter type#>
_ <#parameter name#>: <#parameter type#>
A name before the parameter name gives the parameter an explicit argument label, which can be different from the parameter name. The corresponding argument must use the given argument label in function or method calls.
パラメーター名の前に名前を付けると、パラメーターに明示的な引数ラベルが与えられます。これはパラメーター名とは異なる場合があります。 対応する引数は、関数またはメソッド呼び出しで指定された引数ラベルを使用する必要があります。
An underscore (_
) before a parameter name suppresses the argument label. The corresponding argument must have no label in function or method calls.
パラメーター名の前にアンダースコア (_
) を付けると、引数ラベルが抑制されます。 関数またはメソッド呼び出しでは、対応する引数にラベルを含めることはできません。
func repeatGreeting(_ greeting: String, count n: Int) { /* Greet n times */ }
repeatGreeting("Hello, world!", count: 2) // count is labeled, greeting is not
Parameter Modifiers
パラメータ修飾子
A parameter modifier changes how an argument is passed to the function.
パラメータ修飾子は、引数が関数に渡される方法を変更します。
<#argument label#> <#parameter name#>: <#parameter modifier#> <#parameter type#>
To use a parameter modifier, write inout
, borrowing
, or consuming
before the argument’s type.
パラメータ修飾子を使用するには、引数の型の前に inout
、borrowing
、または consuming
を書き込みます。
func someFunction(a: inout A, b: consuming B, c: C) { ... }
In-Out Parameters
入出力パラメータ
By default, function arguments in Swift are passed by value: Any changes made within the function are not visible in the caller. To make an in-out parameter instead, you apply the inout
parameter modifier.
デフォルトでは、Swift の関数引数は値によって渡されます。関数内で行われた変更は呼び出し元には表示されません。 代わりに in-out パラメータを作成するには、inout パラメータ修飾子を適用します。
func someFunction(a: inout Int) {
a += 1
}
When calling a function that includes in-out parameters, the in-out argument must be prefixed with an ampersand (&
) to mark that the function call can change the argument’s value.
in-out パラメータを含む関数を呼び出す場合、関数呼び出しが引数の値を変更できることを示すために、in-out 引数の前にアンパサンド (&
) を付ける必要があります。
var x = 7
someFunction(&x)
print(x) // Prints "8"
In-out parameters are passed as follows:
入出力パラメータは次のように渡されます。
- When the function is called, the value of the argument is copied.
- 関数が呼び出されると、引数の値がコピーされます。
- In the body of the function, the copy is modified.
- 関数の本体では、コピーが変更されます。
- When the function returns, the copy’s value is assigned to the original argument.
- 関数が戻ると、コピーの値が元の引数に割り当てられます。
This behavior is known as copy-in copy-out or call by value result. For example, when a computed property or a property with observers is passed as an in-out parameter, its getter is called as part of the function call and its setter is called as part of the function return.
この動作は、コピーイン コピーアウト、または値による結果の呼び出しとして知られています。 たとえば、計算プロパティまたはオブザーバーを持つプロパティが入出力パラメーターとして渡される場合、そのゲッターは関数呼び出しの一部として呼び出され、そのセッターは関数戻りの一部として呼び出されます。
As an optimization, when the argument is a value stored at a physical address in memory, the same memory location is used both inside and outside the function body. The optimized behavior is known as call by reference; it satisfies all of the requirements of the copy-in copy-out model while removing the overhead of copying. Write your code using the model given by copy-in copy-out, without depending on the call-by-reference optimization, so that it behaves correctly with or without the optimization.
最適化として、引数がメモリ内の物理アドレスに格納されている値である場合、関数本体の内部と外部の両方で同じメモリ位置が使用されます。 最適化された動作は、参照による呼び出しとして知られています。 コピーのオーバーヘッドを排除しながら、コピーイン コピーアウト モデルの要件をすべて満たします。 参照による呼び出しの最適化に依存せず、コピーイン コピーアウトで指定されたモデルを使用してコードを作成し、最適化の有無にかかわらずコードが正しく動作するようにします。
Within a function, don’t access a value that was passed as an in-out argument, even if the original value is available in the current scope. Accessing the original is a simultaneous access of the value, which violates memory exclusivity.
関数内では、元の値が現在のスコープで使用可能な場合でも、in-out 引数として渡された値にアクセスしないでください。 オリジナルへのアクセスは値への同時アクセスとなり、メモリの排他性に違反します。
var someValue: Int
func someFunction(a: inout Int) {
a += someValue
}
// Error: This causes a runtime exclusivity violation
someFunction(&someValue)
For the same reason, you can’t pass the same value to multiple in-out parameters.
同じ理由で、複数の in-out パラメーターに同じ値を渡すことはできません。
var someValue: Int
func someFunction(a: inout Int, b: inout Int) {
a += b
b += 1
}
// Error: Cannot pass the same value to multiple in-out parameters
someFunction(&someValue, &someValue)
For more information about memory safety and memory exclusivity, see Memory Safety.
メモリの安全性とメモリの排他性の詳細については、「メモリの安全性」をご覧ください。
A closure or nested function that captures an in-out parameter must be nonescaping. If you need to capture an in-out parameter without mutating it, use a capture list to explicitly capture the parameter immutably.
in-out パラメータをキャプチャするクロージャまたは入れ子関数は、非エスケープでなければなりません。 in-out パラメータを変更せずにキャプチャする必要がある場合は、キャプチャ リストを使用してパラメータを不変に明示的にキャプチャします。
func someFunction(a: inout Int) -> () -> Int {
return { [a] in return a + 1 }
}
If you need to capture and mutate an in-out parameter, use an explicit local copy, such as in multithreaded code that ensures all mutation has finished before the function returns.
in-out パラメーターをキャプチャして変更する必要がある場合は、関数が戻る前にすべての変更が確実に完了するように、マルチスレッド コードなどで明示的なローカル コピーを使用します。
func multithreadedFunction(queue: DispatchQueue, x: inout Int) {
// Make a local copy and manually copy it back.
var localX = x
defer { x = localX }
// Operate on localX asynchronously, then wait before returning.
queue.async { someMutatingOperation(&localX) }
queue.sync {}
}
For more discussion and examples of in-out parameters, see In-Out Parameters.
in-out パラメータの詳細な説明と例については、「入出力パラメータ」を参照してください。
Borrowing and Consuming Parameters
パラメータの借用と使用
By default, Swift uses a set of rules to automatically manage object lifetime across function calls, copying values when required. The default rules are designed to minimize overhead in most cases — if you want more specific control, you can apply the borrowing
or consuming
parameter modifier. In this case, use copy
to explicitly mark copy operations.
デフォルトでは、Swift は一連のルールを使用して、関数呼び出し全体でオブジェクトの有効期間を自動的に管理し、必要に応じて値をコピーします。 デフォルトのルールは、ほとんどの場合、オーバーヘッドを最小限に抑えるように設計されています。より具体的な制御が必要な場合は、パラメータのborrowing
またはconsuming
の修飾子を適用できます。 この場合、copy
を使用してコピー操作を明示的にマークします。
Regardless of whether you use the default rules, Swift guarantees that object lifetime and ownership are correctly managed in all cases. These parameter modifiers impact only the relative efficiency of particular usage patterns, not correctness.
デフォルトのルールを使用するかどうかに関係なく、Swift はオブジェクトの有効期間と所有権がすべての場合において正しく管理されることを保証します。 これらのパラメーター修飾子は、正確さではなく、特定の使用パターンの相対的な効率にのみ影響します。
The borrowing
modifier indicates that the function does not keep the parameter’s value. In this case, the caller maintains ownership of the object and the responsibility for the object’s lifetime. Using borrowing
minimizes overhead when the function uses the object only transiently.
borrowing
修飾子は、関数がパラメータの値を保持しないことを示します。 この場合、呼び出し元はオブジェクトの所有権とオブジェクトの存続期間に対する責任を維持します。 borrowing
を使用すると、関数がオブジェクトを一時的にのみ使用する場合のオーバーヘッドが最小限に抑えられます。
// `isLessThan` does not keep either argument
func isLessThan(lhs: borrowing A, rhs: borrowing A) -> Bool {
...
}
If the function needs to keep the parameter’s value for example, by storing it in a global variable — you use copy
to explicitly copy that value.
たとえば、関数がパラメータの値をグローバル変数に保存するなどして保持する必要がある場合は、copy
を使用してその値を明示的にコピーします。
// As above, but this `isLessThan` also wants to record the smallest value
func isLessThan(lhs: borrowing A, rhs: borrowing A) -> Bool {
if lhs < storedValue {
storedValue = copy lhs
} else if rhs < storedValue {
storedValue = copy rhs
}
return lhs < rhs
}
Conversely, the consuming
parameter modifier indicates that the function takes ownership of the value, accepting responsibility for either storing or destroying it before the function returns.
逆に、consuming
パラメータ修飾子は、関数が値の所有権を取得し、関数が戻る前に値を保存または破棄する責任を引き受けることを示します。
// `store` keeps its argument, so mark it `consuming`
func store(a: consuming A) {
someGlobalVariable = a
}
Using consuming
minimizes overhead when the caller no longer needs to use the object after the function call.
consuming
を使用すると、呼び出し元が関数呼び出し後にオブジェクトを使用する必要がなくなったときのオーバーヘッドが最小限に抑えられます。
// Usually, this is the last thing you do with a value
store(a: value)
If you keep using a copyable object after the function call, the compiler automatically makes a copy of that object before the function call.
関数呼び出し後もコピー可能なオブジェクトを使用し続ける場合、コンパイラーは関数呼び出しの前にそのオブジェクトのコピーを自動的に作成します。
// The compiler inserts an implicit copy here
store(a: someValue) // This function consumes someValue
print(someValue) // This uses the copy of someValue
Unlike inout
, neither borrowing
nor consuming
parameters require any special notation when you call the function:
inout
とは異なり、関数を呼び出すときにborrowing
パラメータもconsuming
パラメータも特別な表記を必要としません。
func someFunction(a: borrowing A, b: consuming B) { ... }
someFunction(a: someA, b: someB)
The explicit use of either borrowing
or consuming
indicates your intention to more tightly control the overhead of runtime ownership management. Because copies can cause unexpected runtime ownership operations, parameters marked with either of these modifiers cannot be copied unless you use an explicit copy
keyword:
borrowing
またはconsuming
を明示的に使用することは、実行時の所有権管理のオーバーヘッドをより厳密に制御する意図を示しています。 コピーによって予期しない実行時の所有権操作が発生する可能性があるため、明示的なコピー キーワードを使用しない限り、次の修飾子のいずれかでマークされたパラメータはコピーできません。
func borrowingFunction1(a: borrowing A) {
// Error: Cannot implicitly copy a
// This assignment requires a copy because
// `a` is only borrowed from the caller.
someGlobalVariable = a
}
func borrowingFunction2(a: borrowing A) {
// OK: Explicit copying works
someGlobalVariable = copy a
}
func consumingFunction1(a: consuming A) {
// Error: Cannot implicitly copy a
// This assignment requires a copy because
// of the following `print`
someGlobalVariable = a
print(a)
}
func consumingFunction2(a: consuming A) {
// OK: Explicit copying works regardless
someGlobalVariable = copy a
print(a)
}
func consumingFunction3(a: consuming A) {
// OK: No copy needed here because this is the last use
someGlobalVariable = a
}
Special Kinds of Parameters
特殊な種類のパラメータ
Parameters can be ignored, take a variable number of values, and provide default values using the following forms:
パラメータは無視したり、可変数の値を取得したり、次の形式を使用してデフォルト値を指定したりすることができます。
_ : <#parameter type#>
<#parameter name#>: <#parameter type#>...
<#parameter name#>: <#parameter type#> = <#default argument value#>
An underscore (_
) parameter is explicitly ignored and can’t be accessed within the body of the function.
アンダースコア (_
) パラメータは明示的に無視され、関数の本体内ではアクセスできません。
A parameter with a base type name followed immediately by three dots (...
) is understood as a variadic parameter. A parameter that immediately follows a variadic parameter must have an argument label. A function can have multiple variadic parameters. A variadic parameter is treated as an array that contains elements of the base type name. For example, the variadic parameter Int...
is treated as [Int]
. For an example that uses a variadic parameter, see Variadic Parameters.
基本型名の直後に 3 つのドット (…
) が続くパラメーターは、可変個引数パラメーターとして理解されます。 可変個引数パラメーターの直後に続くパラメーターには、引数ラベルが必要です。 関数には複数の可変個引数パラメーターを含めることができます。 可変個引数パラメーターは、基本型名の要素を含む配列として扱われます。 たとえば、可変個引数パラメーター Int…
は [Int]
として扱われます。 可変個引数パラメーターを使用する例については、「可変個引数パラメーター」を参照してください。
A parameter with an equal sign (=
) and an expression after its type is understood to have a default value of the given expression. The given expression is evaluated when the function is called. If the parameter is omitted when calling the function, the default value is used instead.
等号 (=
) とその型の後に式が付いているパラメーターは、指定された式のデフォルト値を持つものとして理解されます。 指定された式は、関数が呼び出されたときに評価されます。 関数呼び出し時にパラメータを省略した場合は、代わりにデフォルト値が使用されます。
func f(x: Int = 42) -> Int { return x }
f() // Valid, uses default value
f(x: 7) // Valid, uses the value provided
f(7) // Invalid, missing argument label
Special Kinds of Methods
特殊な種類のメソッド
Methods on an enumeration or a structure that modify self
must be marked with the mutating
declaration modifier.
self
を変更する列挙型または構造体のメソッドは、mutating
修飾子でマークする必要があります。
Methods that override a superclass method must be marked with the override
declaration modifier. It’s a compile-time error to override a method without the override
modifier or to use the override
modifier on a method that doesn’t override a superclass method.
スーパークラス メソッドをオーバーライドするメソッドは、override
宣言修飾子でマークする必要があります。 override
修飾子を使用せずにメソッドをオーバーライドしたり、スーパークラス メソッドをオーバーライドしないメソッドで override
修飾子を使用したりすると、コンパイル時エラーになります。
Methods associated with a type rather than an instance of a type must be marked with the static
declaration modifier for enumerations and structures, or with either the static
or class
declaration modifier for classes. A class type method marked with the class
declaration modifier can be overridden by a subclass implementation; a class type method marked with class final
or static
can’t be overridden.
型のインスタンスではなく型に関連付けられたメソッドは、列挙型と構造体の場合は static
宣言修飾子でマークするか、クラスの場合は static
宣言修飾子またはclass
宣言修飾子でマークする必要があります。 class
宣言修飾子でマークされたクラス型メソッドは、サブクラス実装によってオーバーライドできます。 class Final
または static
とマークされたクラス型のメソッドはオーバーライドできません。
Methods with Special Names
特別な名前を持つメソッド
Several methods that have special names enable syntactic sugar for function call syntax. If a type defines one of these methods, instances of the type can be used in function call syntax. The function call is understood to be a call to one of the specially named methods on that instance.
特別な名前を持ついくつかのメソッドでは、関数呼び出し構文の糖衣構文が有効になります。 型がこれらのメソッドのいずれかを定義している場合、その型のインスタンスを関数呼び出し構文で使用できます。 関数呼び出しは、そのインスタンス上の特別に名前が付けられたメソッドの 1 つへの呼び出しであると理解されます。
A class, structure, or enumeration type can support function call syntax by defining a dynamicallyCall(withArguments:)
method or a dynamicallyCall(withKeywordArguments:)
method, as described in dynamicCallable, or by defining a call-as-function method, as described below. If the type defines both a call-as-function method and one of the methods used by the dynamicCallable
attribute, the compiler gives preference to the call-as-function method in circumstances where either method could be used.
クラス、構造体、または列挙型は、動的呼び出し可能 で説明されているように dynamicallyCall(withArguments:)
メソッドまたは dynamicallyCall(withKeywordArguments:)
メソッドを定義するか、または以下で説明されている関数としての呼び出しメソッドを定義することによって、関数呼び出し構文をサポートできます。 。 型が call-as-function メソッドと、dynamicCallable
属性で使用されるメソッドの 1 つの両方を定義している場合、コンパイラは、どちらかのメソッドが使用できる状況では、call-as-function メソッドを優先します。
The name of a call-as-function method is callAsFunction()
, or another name that begins with callAsFunction(
and adds labeled or unlabeled arguments — for example, callAsFunction(_:_:)
and callAsFunction(something:)
are also valid call-as-function method names.
関数としての呼び出しメソッドの名前は、callAsFunction()
、または callAsFunction(
で始まり、ラベル付きまたはラベルなしの引数を追加する別の名前です。たとえば、
や callAsFunction(_:_:)
callAsFunction(something:)
も有効な call-as-function メソッド名です。
The following function calls are equivalent:
次の関数呼び出しは同等です。
struct CallableStruct {
var value: Int
func callAsFunction(_ number: Int, scale: Int) {
print(scale * (number + value))
}
}
let callable = CallableStruct(value: 100)
callable(4, scale: 2)
callable.callAsFunction(4, scale: 2)
// Both function calls print 208.
The call-as-function methods and the methods from the dynamicCallable
attribute make different trade-offs between how much information you encode into the type system and how much dynamic behavior is possible at runtime. When you declare a call-as-function method, you specify the number of arguments, and each argument’s type and label. The dynamicCallable
attribute’s methods specify only the type used to hold the array of arguments.
call-as-function メソッドと dynamicCallable
属性のメソッドでは、型システムにエンコードする情報の量と実行時に可能な動的動作の量との間で異なるトレードオフが行われます。 call-as-function メソッドを宣言するときは、引数の数と各引数の型とラベルを指定します。 DynamicCallable
属性のメソッドは、引数の配列を保持するために使用される型のみを指定します。
Defining a call-as-function method, or a method from the dynamicCallable
attribute, doesn’t let you use an instance of that type as if it were a function in any context other than a function call expression. For example:
call-as-function メソッド、または dynamicCallable
属性のメソッドを定義すると、その型のインスタンスを関数呼び出し式以外のコンテキストで関数であるかのように使用することはできません。 例えば:
let someFunction1: (Int, Int) -> Void = callable(_:scale:) // Error
let someFunction2: (Int, Int) -> Void = callable.callAsFunction(_:scale:)
The subscript(dynamicMember:)
subscript enables syntactic sugar for member lookup, as described in dynamicMemberLookup.
「動的メンバー検索」で説明されているように、subscript(dynamicMember:)
サブスクリプトはメンバー検索の糖衣構文を有効にします。
Throwing Functions and Methods
スローする関数とメソッド
Functions and methods that can throw an error must be marked with the throws
keyword. These functions and methods are known as throwing functions and throwing methods. They have the following form:
エラーをスローする可能性のある関数とメソッドには、throws
キーワードを付ける必要があります。 これらの関数とメソッドは、スロー関数およびスロー メソッドとして知られています。 それらの形式は次のとおりです。
func <#function name#>(<#parameters#>) throws -> <#return type#> {
<#statements#>
}
Calls to a throwing function or method must be wrapped in a try
or try!
expression (that is, in the scope of a try
or try!
operator).
スロー関数またはメソッドの呼び出しは、try
または try!
でラップする必要があります。 式(つまり、try
または try!
演算子のスコープ内)。
The throws
keyword is part of a function’s type, and nonthrowing functions are subtypes of throwing functions. As a result, you can use a nonthrowing function in a context where a throwing one is expected.
throws
キーワードは関数の型の一部であり、非スロー関数はスロー関数のサブ型です。 その結果、スロー関数が予期されるコンテキストで非スロー関数を使用できます。
You can’t overload a function based only on whether the function can throw an error. That said, you can overload a function based on whether a function parameter can throw an error.
関数がエラーをスローできるかどうかのみに基づいて関数をオーバーロードすることはできません。 ただし、関数パラメータがエラーをスローできるかどうかに基づいて関数をオーバーロードできます。
A throwing method can’t override a nonthrowing method, and a throwing method can’t satisfy a protocol requirement for a nonthrowing method. That said, a nonthrowing method can override a throwing method, and a nonthrowing method can satisfy a protocol requirement for a throwing method.
スロー メソッドは非スロー メソッドをオーバーライドできません。また、スロー メソッドは非スロー メソッドのプロトコル要件を満たすことはできません。 つまり、非スロー メソッドはスロー メソッドをオーバーライドでき、非スロー メソッドはスロー メソッドのプロトコル要件を満たすことができます。
Rethrowing Functions and Methods
再スローする関数とメソッド
A function or method can be declared with the rethrows
keyword to indicate that it throws an error only if one of its function parameters throws an error. These functions and methods are known as rethrowing functions and rethrowing methods. Rethrowing functions and methods must have at least one throwing function parameter.
関数またはメソッドは、rethrows
キーワードを使用して宣言して、関数パラメータの 1 つがエラーをスローした場合にのみエラーをスローすることを示すことができます。 これらの関数とメソッドは、再スロー関数および再スロー メソッドとして知られています。 再スローする関数とメソッドには、少なくとも 1 つのスロー関数パラメータが必要です。
func someFunction(callback: () throws -> Void) rethrows {
try callback()
}
A rethrowing function or method can contain a throw
statement only inside a catch
clause. This lets you call the throwing function inside a do
–catch
statement and handle errors in the catch
clause by throwing a different error. In addition, the catch
clause must handle only errors thrown by one of the rethrowing function’s throwing parameters. For example, the following is invalid because the catch
clause would handle the error thrown by alwaysThrows()
.
再スローする関数またはメソッドには、catch
句内にのみ throw
ステートメントを含めることができます。 これにより、do-catch
ステートメント内でスロー関数を呼び出し、別のエラーをスローすることで catch
句内のエラーを処理できるようになります。 さらに、catch
句は、再スロー関数のスロー パラメータの 1 つによってスローされたエラーのみを処理する必要があります。 たとえば、次の例は、catch
句がalwaysThrows()
によってスローされたエラーを処理するため、無効です。
func alwaysThrows() throws {
throw SomeError.error
}
func someFunction(callback: () throws -> Void) rethrows {
do {
try callback()
try alwaysThrows() // Invalid, alwaysThrows() isn't a throwing parameter
} catch {
throw AnotherError.error
}
}
A throwing method can’t override a rethrowing method, and a throwing method can’t satisfy a protocol requirement for a rethrowing method. That said, a rethrowing method can override a throwing method, and a rethrowing method can satisfy a protocol requirement for a throwing method.
スロー メソッドは再スロー メソッドをオーバーライドできません。また、スロー メソッドは再スロー メソッドのプロトコル要件を満たすことはできません。 つまり、再スロー メソッドはスロー メソッドをオーバーライドでき、再スロー メソッドはスロー メソッドのプロトコル要件を満たすことができます。
Asynchronous Functions and Methods
非同期の関数とメソッド
Functions and methods that run asynchronously must be marked with the async
keyword. These functions and methods are known as asynchronous functions and asynchronous methods. They have the following form:
非同期で実行される関数とメソッドには、async
キーワードを付ける必要があります。 これらの関数とメソッドは、非同期関数および非同期メソッドとして知られています。 それらの形式は次のとおりです。
func <#function name#>(<#parameters#>) async -> <#return type#> {
<#statements#>
}
Calls to an asynchronous function or method must be wrapped in an await
expression — that is, they must be in the scope of an await
operator.
非同期関数またはメソッドの呼び出しは、await
式でラップする必要があります。つまり、await
演算子のスコープ内にある必要があります。
The async
keyword is part of the function’s type, and synchronous functions are subtypes of asynchronous functions. As a result, you can use a synchronous function in a context where an asynchronous function is expected. For example, you can override an asynchronous method with a synchronous method, and a synchronous method can satisfy a protocol requirement that requires an asynchronous method.
async
キーワードは関数の型の一部であり、同期関数は非同期関数のサブ型です。 その結果、非同期関数が予期されるコンテキストで同期関数を使用できます。 たとえば、非同期メソッドを同期メソッドでオーバーライドでき、非同期メソッドを必要とするプロトコル要件を同期メソッドで満たすことができます。
You can overload a function based on whether or not the function is asynchronous. At the call site, context determines which overload is used: In an asynchronous context, the asynchronous function is used, and in a synchronous context, the synchronous function is used.
関数が非同期かどうかに基づいて関数をオーバーロードできます。 呼び出しサイトでは、コンテキストによってどのオーバーロードが使用されるかが決まります。非同期コンテキストでは非同期関数が使用され、同期コンテキストでは同期関数が使用されます。
An asynchronous method can’t override a synchronous method, and an asynchronous method can’t satisfy a protocol requirement for a synchronous method. That said, a synchronous method can override an asynchronous method, and a synchronous method can satisfy a protocol requirement for an asynchronous method.
非同期メソッドは同期メソッドをオーバーライドできません。また、非同期メソッドは同期メソッドのプロトコル要件を満たすことはできません。 つまり、同期メソッドは非同期メソッドをオーバーライドでき、同期メソッドは非同期メソッドのプロトコル要件を満たすことができます。
Functions that Never Return
決して戻らない関数
Swift defines a Never
(Link:developer.apple.com) type, which indicates that a function or method doesn’t return to its caller. Functions and methods with the Never
return type are called nonreturning. Nonreturning functions and methods either cause an irrecoverable error or begin a sequence of work that continues indefinitely. This means that code that would otherwise run immediately after the call is never executed. Throwing and rethrowing functions can transfer program control to an appropriate catch
block, even when they’re nonreturning.
Swift は、関数またはメソッドが呼び出し元に戻らないことを示す Never
(Link:developer.apple.com)(英語)型を定義します。 Never
return 型の関数とメソッドは、nonreturn と呼ばれます。 Nonreturning 関数やメソッドは、回復不能なエラーを引き起こすか、無限に続く一連の作業を開始します。 これは、呼び出し直後に実行されるコードが決して実行されないことを意味します。 スロー関数と再スロー関数は、関数が戻らない場合でも、プログラム制御を適切な catch
ブロックに転送できます。
A nonreturning function or method can be called to conclude the else
clause of a guard statement, as discussed in Guard Statement.
「ガードステートメント」で説明されているように、戻らない関数またはメソッドを呼び出して、ガード ステートメントの else
節を終了することができます。
You can override a nonreturning method, but the new method must preserve its return type and nonreturning behavior.
戻らないメソッドをオーバーライドすることはできますが、新しいメソッドは戻り値の型と戻らない動作を保持する必要があります。
Grammar of a function declaration
function-declaration → function-head function-name generic-parameter-clause? function-signature generic-where-clause? function-body?
function-head → attributes? declaration-modifiers? func
function-name → identifier | operator
function-signature → parameter-clause async
? throws
? function-result?
function-signature → parameter-clause async
? rethrows
function-result?
function-result → ->
attributes? type
function-body → code-block
parameter-clause → (
)
| (
parameter-list )
parameter-list → parameter | parameter ,
parameter-list
parameter → external-parameter-name? local-parameter-name parameter-type-annotation default-argument-clause?
parameter → external-parameter-name? local-parameter-name parameter-type-annotation
parameter → external-parameter-name? local-parameter-name parameter-type-annotation ...
external-parameter-name → identifier
local-parameter-name → identifier
parameter-type-annotation → :
attributes? parameter-modifier? type
parameter-modifier → inout
| borrowing
| consuming
default-argument-clause → =
expression
Enumeration Declaration
列挙宣言
An enumeration declaration introduces a named enumeration type into your program.
列挙型宣言は、名前付き列挙型をプログラムに導入します。
Enumeration declarations have two basic forms and are declared using the enum
keyword. The body of an enumeration declared using either form contains zero or more values — called enumeration cases — and any number of declarations, including computed properties, instance methods, type methods, initializers, type aliases, and even other enumeration, structure, class, and actor declarations. Enumeration declarations can’t contain deinitializer or protocol declarations.
列挙宣言には 2 つの基本形式があり、enum
キーワードを使用して宣言されます。 いずれかの形式を使用して宣言された列挙型の本体には、0 個以上の値 (列挙型ケースと呼ばれます) と、計算プロパティ、インスタンス メソッド、型メソッド、イニシャライザ、型エイリアス、さらには他の列挙型、構造体、クラス、アクターなどの任意の数の宣言が含まれます。 列挙型宣言には、初期化解除子またはプロトコル宣言を含めることはできません。
Enumeration types can adopt any number of protocols, but can’t inherit from classes, structures, or other enumerations.
列挙型は任意の数のプロトコルを採用できますが、クラス、構造体、または他の列挙型から継承することはできません。
Unlike classes and structures, enumeration types don’t have an implicitly provided default initializer; all initializers must be declared explicitly. Initializers can delegate to other initializers in the enumeration, but the initialization process is complete only after an initializer assigns one of the enumeration cases to self
.
クラスや構造体とは異なり、列挙型には暗黙的に提供されるデフォルトの初期化子がありません。 すべての初期化子は明示的に宣言する必要があります。 イニシャライザは列挙内の他のイニシャライザに委任できますが、初期化プロセスは、イニシャライザが列挙ケースの 1 つをself
に割り当てた後にのみ完了します。
Like structures but unlike classes, enumerations are value types; instances of an enumeration are copied when assigned to variables or constants, or when passed as arguments to a function call. For information about value types, see Structures and Enumerations Are Value Types.
構造体と似ていますが、クラスとは異なり、列挙型は値型です。 列挙型のインスタンスは、変数または定数に割り当てられるとき、または関数呼び出しに引数として渡されるときにコピーされます。 値の型については、「構造体と列挙は値の型」を参照してください。
You can extend the behavior of an enumeration type with an extension declaration, as discussed in Extension Declaration.
「拡張宣言」で説明されているように、拡張宣言を使用して列挙型の動作を拡張できます。
Enumerations with Cases of Any Type
任意の型のケースを含む列挙
The following form declares an enumeration type that contains enumeration cases of any type:
次の形式は、任意の型の列挙型ケースを含む列挙型を宣言します。
enum <#enumeration name#>: <#adopted protocols#> {
case <#enumeration case 1#>
case <#enumeration case 2#>(<#associated value types#>)
}
Enumerations declared in this form are sometimes called discriminated unions in other programming languages.
この形式で宣言された列挙は、他のプログラミング言語では判別共用体と呼ばれることもあります。
In this form, each case block consists of the case
keyword followed by one or more enumeration cases, separated by commas. The name of each case must be unique. Each case can also specify that it stores values of a given type. These types are specified in the associated value types tuple, immediately following the name of the case.
この形式では、各ケース ブロックは、case
キーワードと、それに続くカンマで区切られた 1 つ以上の列挙ケースで構成されます。 各ケースの名前は一意である必要があります。 各ケースでは、特定の型の値を格納することも指定できます。 これらの型は、ケース名の直後にある、関連付けられた値の型のタプルで指定されます。
Enumeration cases that store associated values can be used as functions that create instances of the enumeration with the specified associated values. And just like functions, you can get a reference to an enumeration case and apply it later in your code.
関連する値を格納する列挙型ケースは、指定された関連する値を持つ列挙型のインスタンスを作成する関数として使用できます。 また、関数と同様に、列挙型ケースへの参照を取得して、後からコードに適用できます。
enum Number {
case integer(Int)
case real(Double)
}
let f = Number.integer
// f is a function of type (Int) -> Number
// Apply f to create an array of Number instances with integer values
let evenInts: [Number] = [0, 2, 4, 6].map(f)
For more information and to see examples of cases with associated value types, see Associated Values.
詳細と、関連する値型のケースの例については、「関連する値」をご覧ください。
Enumerations with Indirection
間接的な列挙
Enumerations can have a recursive structure, that is, they can have cases with associated values that are instances of the enumeration type itself. However, instances of enumeration types have value semantics, which means they have a fixed layout in memory. To support recursion, the compiler must insert a layer of indirection.
列挙型は再帰的な構造を持つことができます。つまり、列挙型自体のインスタンスである関連する値を持つケースを持つことができます。 ただし、列挙型のインスタンスには値セマンティクスがあり、メモリ内に固定レイアウトがあることを意味します。 再帰をサポートするには、コンパイラは間接層を挿入する必要があります。
To enable indirection for a particular enumeration case, mark it with the indirect
declaration modifier. An indirect case must have an associated value.
特定の列挙ケースで間接化を有効にするには、その列挙ケースをindirect
宣言修飾子でマークします。 間接的なケースには、関連する値が必要です。
enum Tree<T> {
case empty
indirect case node(value: T, left: Tree, right: Tree)
}
To enable indirection for all the cases of an enumeration that have an associated value, mark the entire enumeration with the indirect
modifier — this is convenient when the enumeration contains many cases that would each need to be marked with the indirect
modifier.
付属値が関連付けられている列挙のすべてのケースに対して間接化を有効にするには、列挙全体をindirect
修飾子でマークします。これは、列挙にそれぞれindirect
修飾子でマークする必要がある多くのケースが含まれている場合に便利です。
An enumeration that’s marked with the indirect
modifier can contain a mixture of cases that have associated values and cases those that don’t. That said, it can’t contain any cases that are also marked with the indirect
modifier.
indirect
修飾子でマークされた列挙には、値が関連付けられているケースと値が関連付けられていないケースが混在している場合があります。 ただし、indirect
修飾子が付けられたケースを含めることはできません。
Enumerations with Cases of a Raw-Value Type
生の値型のケースを含む列挙
The following form declares an enumeration type that contains enumeration cases of the same basic type:
次の形式は、同じ基本型の列挙型ケースを含む列挙型を宣言します。
enum <#enumeration name#>: <#raw-value type#>, <#adopted protocols#> {
case <#enumeration case 1#> = <#raw value 1#>
case <#enumeration case 2#> = <#raw value 2#>
}
In this form, each case block consists of the case
keyword, followed by one or more enumeration cases, separated by commas. Unlike the cases in the first form, each case has an underlying value, called a raw value, of the same basic type. The type of these values is specified in the raw-value type and must represent an integer, floating-point number, string, or single character. In particular, the raw-value type must conform to the Equatable
protocol and one of the following protocols: ExpressibleByIntegerLiteral
for integer literals, ExpressibleByFloatLiteral
for floating-point literals, ExpressibleByStringLiteral
for string literals that contain any number of characters, and ExpressibleByUnicodeScalarLiteral
or ExpressibleByExtendedGraphemeClusterLiteral
for string literals that contain only a single character. Each case must have a unique name and be assigned a unique raw value.
この形式では、各 case ブロックは case
キーワードと、それに続くカンマで区切られた 1 つ以上の列挙ケースで構成されます。 最初の形式のケースとは異なり、各ケースには、同じ基本型の生の値と呼ばれる基礎となる値があります。 これらの値の型は 生の値型で指定され、整数、浮動小数点数、文字列、または単一の文字を表す必要があります。 特に、生の値型は、Equatable
プロトコルと次のプロトコルのいずれかに準拠する必要があります: 整数リテラルの場合は ExpressibleByIntegerLiteral
、浮動小数点リテラルの場合は ExpressibleByFloatLiteral
、任意の数の文字を含む文字列リテラルの場合は ExpressibleByStringLiteral
、単一文字のみを含む文字列リテラルの場合はExpressibleByUnicodeScalarLiteral
または、
。 各ケースには一意の名前が付けられ、一意の生の値が割り当てられる必要があります。ExpressibleByExtendedGraphemeClusterLiteral
If the raw-value type is specified as Int
and you don’t assign a value to the cases explicitly, they’re implicitly assigned the values 0
, 1
, 2
, and so on. Each unassigned case of type Int
is implicitly assigned a raw value that’s automatically incremented from the raw value of the previous case.
生の値の型が Int
として指定されており、ケースに明示的に値を割り当てない場合、暗黙的に値 0、1、2
などが割り当てられます。 Int
型の未割り当ての各ケースには、前のケースの生の値から自動的に増分される生の値が暗黙的に割り当てられます。
enum ExampleEnum: Int {
case a, b, c = 5, d
}
In the above example, the raw value of ExampleEnum.a
is 0
and the value of ExampleEnum.b
is 1
. And because the value of ExampleEnum.c
is explicitly set to 5
, the value of ExampleEnum.d
is automatically incremented from 5
and is therefore 6
.
上記の例では、ExampleEnum.a
の生の値は 0
で、ExampleEnum.b
の値は 1
です。また、ExampleEnum.c
の値は明示的に 5
に設定されているため、ExampleEnum.d
の値は 5
から自動的に増加し、6
です。
If the raw-value type is specified as String
and you don’t assign values to the cases explicitly, each unassigned case is implicitly assigned a string with the same text as the name of that case.
生の値の型が String
として指定されており、ケースに値を明示的に割り当てない場合、割り当てられていない各ケースには、そのケースの名前と同じテキストを持つ文字列が暗黙的に割り当てられます。
enum GamePlayMode: String {
case cooperative, individual, competitive
}
In the above example, the raw value of GamePlayMode.cooperative
is "cooperative"
, the raw value of GamePlayMode.individual
is "individual"
, and the raw value of GamePlayMode.competitive
is "competitive"
.
上の例では、GamePlayMode.cooperative
の生の値は「cooperative
」、GamePlayMode.individual
の生の値は「individual
」、GamePlayMode.competitive
の生の値は「competitive
」です。
Enumerations that have cases of a raw-value type implicitly conform to the RawRepresentable
protocol, defined in the Swift standard library. As a result, they have a rawValue
property and a failable initializer with the signature init?(rawValue: RawValue)
. You can use the rawValue
property to access the raw value of an enumeration case, as in ExampleEnum.b.rawValue
. You can also use a raw value to find a corresponding case, if there is one, by calling the enumeration’s failable initializer, as in ExampleEnum(rawValue: 5)
, which returns an optional case. For more information and to see examples of cases with raw-value types, see Raw Values.
生の値型のケースを持つ列挙は、Swift 標準ライブラリで定義されている RawRepresentable
プロトコルに暗黙的に準拠します。 その結果、rawValue
プロパティと、 init?(rawValue: RawValue)
を持つ失敗可能なイニシャライザが存在します。 ExampleEnum.b.rawValue
のように、rawValue
プロパティを使用して列挙ケースの生の値にアクセスできます。 また、列挙型の失敗可能なイニシャライザを呼び出して、ExampleEnum(rawValue: 5)
のように対応するケースがあれば、生の値を対応するケースから見つけることもできます。これは、オプションのケースを返します。 詳細と生の値型の例については、「生の値」を参照してください。
Accessing Enumeration Cases
列挙ケースへのアクセス
To reference the case of an enumeration type, use dot (.
) syntax, as in EnumerationType.enumerationCase
. When the enumeration type can be inferred from context, you can omit it (the dot is still required), as described in Enumeration Syntax and Implicit Member Expression.
列挙型の大文字と小文字を参照するには、EnumerationType.enumerationCase
のようにドット (.
) 構文を使用します。 列挙型がコンテキストから推測できる場合は、「列挙構文」と「暗黙的なメンバー式」で説明されているように、列挙型を省略できます (ドットは依然として必須です)。
To check the values of enumeration cases, use a switch
statement, as shown in Matching Enumeration Values with a Switch Statement. The enumeration type is pattern-matched against the enumeration case patterns in the case blocks of the switch
statement, as described in Enumeration Case Pattern.
列挙ケースの値を確認するには、「Switch ステートメントを使用した列挙値の照合」に示すように、switch ステートメントを使用します。 「列挙型ケースのパターン」で説明されているように、列挙型は、switch ステートメントの case ブロック内の列挙型ケース パターンとパターン マッチングされます。
Grammar of an enumeration declaration
enum-declaration → attributes? access-level-modifier? union-style-enum
enum-declaration → attributes? access-level-modifier? raw-value-style-enum
union-style-enum → indirect
? enum
enum-name generic-parameter-clause? type-inheritance-clause? generic-where-clause? {
union-style-enum-members? }
union-style-enum-members → union-style-enum-member union-style-enum-members?
union-style-enum-member → declaration | union-style-enum-case-clause | compiler-control-statement
union-style-enum-case-clause → attributes? indirect
? case
union-style-enum-case-list
union-style-enum-case-list → union-style-enum-case | union-style-enum-case ,
union-style-enum-case-list
union-style-enum-case → enum-case-name tuple-type?
enum-name → identifier
enum-case-name → identifier
raw-value-style-enum → enum
enum-name generic-parameter-clause? type-inheritance-clause generic-where-clause? {
raw-value-style-enum-members }
raw-value-style-enum-members → raw-value-style-enum-member raw-value-style-enum-members?
raw-value-style-enum-member → declaration | raw-value-style-enum-case-clause | compiler-control-statement
raw-value-style-enum-case-clause → attributes? case
raw-value-style-enum-case-list
raw-value-style-enum-case-list → raw-value-style-enum-case | raw-value-style-enum-case ,
raw-value-style-enum-case-list
raw-value-style-enum-case → enum-case-name raw-value-assignment?
raw-value-assignment → =
raw-value-literal
raw-value-literal → numeric-literal | static-string-literal | boolean-literal
Structure Declaration
構造宣言
A structure declaration introduces a named structure type into your program. Structure declarations are declared using the struct
keyword and have the following form:
構造宣言は、名前付きの構造型をプログラムに導入します。 構造宣言は struct
キーワードを使用して宣言され、次の形式になります。
struct <#structure name#>: <#adopted protocols#> {
<#declarations#>
}
The body of a structure contains zero or more declarations. These declarations can include both stored and computed properties, type properties, instance methods, type methods, initializers, subscripts, type aliases, and even other structure, class, actor, and enumeration declarations. Structure declarations can’t contain deinitializer or protocol declarations. For a discussion and several examples of structures that include various kinds of declarations, see Structures and Classes.
構造体の本体には 0 個以上の宣言が含まれています。 これらの宣言には、保存されたプロパティと計算されたプロパティの両方、型プロパティ、インスタンス メソッド、型メソッド、初期化子、添え字、型エイリアス、さらには他の構造体、クラス、アクター、列挙体の宣言を含めることができます。 構造体の宣言には、初期化解除子やプロトコルの宣言を含めることはできません。 さまざまな種類の宣言を含む構造の説明といくつかの例については、「構造とクラス」を参照してください。
Structure types can adopt any number of protocols, but can’t inherit from classes, enumerations, or other structures.
構造型は任意の数のプロトコルを採用できますが、クラス、列挙、または他の構造から継承することはできません。
There are three ways to create an instance of a previously declared structure:
以前に宣言した構造体のインスタンスを作成するには、次の 3 つの方法があります。
- Call one of the initializers declared within the structure, as described in Initializers.
- 「初期化子」で説明されているように、構造内で宣言されたイニシャライザの 1 つを呼び出します。
- If no initializers are declared, call the structure’s memberwise initializer, as described in Memberwise Initializers for Structure Types.
- 初期化子が宣言されていない場合は、「構造体型のメンバーごとの初期化子」で説明されているように、構造体のメンバーごとの初期化子を呼び出します。
- If no initializers are declared, and all properties of the structure declaration were given initial values, call the structure’s default initializer, as described in Default Initializers.
- イニシャライザが宣言されておらず、構造体宣言のすべてのプロパティに初期値が指定されている場合は、デフォルトのイニシャライザで説明されているように、構造体のデフォルトのイニシャライザを呼び出します。
The process of initializing a structure’s declared properties is described in Initialization.
構造体の宣言されたプロパティを初期化するプロセスについては、「初期化」で説明されています。
Properties of a structure instance can be accessed using dot (.
) syntax, as described in Accessing Properties.
構造体インスタンスのプロパティには、「プロパティへのアクセス」で説明されているように、ドット (.
) 構文を使用してアクセスできます。
Structures are value types; instances of a structure are copied when assigned to variables or constants, or when passed as arguments to a function call. For information about value types, see Structures and Enumerations Are Value Types.
構造体は値の型です。 構造体のインスタンスは、変数または定数に割り当てられるとき、または関数呼び出しに引数として渡されるときにコピーされます。 値の型については、「構造体と列挙は値の型です」を参照してください。
You can extend the behavior of a structure type with an extension declaration, as discussed in Extension Declaration.
「拡張宣言」で説明されているように、拡張宣言を使用して構造型の動作を拡張できます。
Grammar of a structure declaration
struct-declaration → attributes? access-level-modifier? struct
struct-name generic-parameter-clause? type-inheritance-clause? generic-where-clause? struct-body
struct-name → identifier
struct-body → {
struct-members? }
struct-members → struct-member struct-members?
struct-member → declaration | compiler-control-statement
Class Declaration
クラス宣言
A class declaration introduces a named class type into your program. Class declarations are declared using the class
keyword and have the following form:
クラス宣言は、名前付きクラス型をプログラムに導入します。 クラス宣言は class
キーワードを使用して宣言され、次の形式になります。
class <#class name#>: <#superclass#>, <#adopted protocols#> {
<#declarations#>
}
The body of a class contains zero or more declarations. These declarations can include both stored and computed properties, instance methods, type methods, initializers, a single deinitializer, subscripts, type aliases, and even other class, structure, actor, and enumeration declarations. Class declarations can’t contain protocol declarations. For a discussion and several examples of classes that include various kinds of declarations, see Structures and Classes.
クラスの本文には 0 個以上の宣言が含まれています。 これらの宣言には、保存されたプロパティと計算されたプロパティの両方、インスタンス メソッド、型メソッド、イニシャライザ、単一の初期化解除子、添字、型エイリアス、さらには他のクラス、構造体、アクター、列挙型の宣言を含めることができます。 クラス宣言にプロトコル宣言を含めることはできません。 さまざまな種類の宣言を含むクラスの説明といくつかの例については、「構造とクラス」を参照してください。
A class type can inherit from only one parent class, its superclass, but can adopt any number of protocols. The superclass appears first after the class name and colon, followed by any adopted protocols. Generic classes can inherit from other generic and nongeneric classes, but a nongeneric class can inherit only from other nongeneric classes. When you write the name of a generic superclass class after the colon, you must include the full name of that generic class, including its generic parameter clause.
クラス型は 1 つの親クラス、そのスーパークラスからのみ継承できますが、任意の数のプロトコルを採用できます。 スーパークラスはクラス名とコロンの後に最初に表示され、その後に採用されているプロトコルが続きます。 ジェネリック クラスは他のジェネリック クラスおよび非ジェネリック クラスから継承できますが、非ジェネリック クラスは他の非ジェネリック クラスからのみ継承できます。 コロンの後にジェネリック スーパークラス クラスの名前を記述する場合は、ジェネリック パラメータ句を含む、そのジェネリック クラスの完全な名前を含める必要があります。
As discussed in Initializer Declaration, classes can have designated and convenience initializers. The designated initializer of a class must initialize all of the class’s declared properties and it must do so before calling any of its superclass’s designated initializers.
イニシャライザ宣言で説明したように、クラスには指定された便利なイニシャライザを含めることができます。 クラスの指定されたイニシャライザは、クラスの宣言されたプロパティをすべて初期化する必要があり、スーパークラスの指定されたイニシャライザを呼び出す前に初期化する必要があります。
A class can override properties, methods, subscripts, and initializers of its superclass. Overridden properties, methods, subscripts, and designated initializers must be marked with the override
declaration modifier.
クラスは、そのスーパークラスのプロパティ、メソッド、サブスクリプト、および初期化子をオーバーライドできます。 オーバーライドされたプロパティ、メソッド、添え字、指定されたイニシャライザは、override
宣言修飾子でマークする必要があります。
To require that subclasses implement a superclass’s initializer, mark the superclass’s initializer with the required
declaration modifier. The subclass’s implementation of that initializer must also be marked with the required
declaration modifier.
サブクラスがスーパークラスのイニシャライザを実装することを必須にするには、スーパークラスのイニシャライザをrequired
宣言修飾子でマークします。 そのイニシャライザのサブクラスの実装も、required
宣言修飾子でマークする必要があります。
Although properties and methods declared in the superclass are inherited by the current class, designated initializers declared in the superclass are only inherited when the subclass meets the conditions described in Automatic Initializer Inheritance. Swift classes don’t inherit from a universal base class.
スーパークラスで宣言されたプロパティとメソッドは現在のクラスに継承されますが、スーパークラスで宣言された指定のイニシャライザは、サブクラスが「自動イニシャライザの継承」で説明されている条件を満たした場合にのみ継承されます。 Swift クラスはユニバーサル基本クラスを継承しません。
There are two ways to create an instance of a previously declared class:
以前に宣言したクラスのインスタンスを作成するには、次の 2 つの方法があります。
- Call one of the initializers declared within the class, as described in Initializers.
- 「初期化子」で説明されているように、クラス内で宣言されたイニシャライザの 1 つを呼び出します。
- If no initializers are declared, and all properties of the class declaration were given initial values, call the class’s default initializer, as described in Default Initializers.
- イニシャライザが宣言されておらず、クラス宣言のすべてのプロパティに初期値が指定されている場合は、デフォルトのイニシャライザで説明されているように、クラスのデフォルトのイニシャライザを呼び出します。
Access properties of a class instance with dot (.
) syntax, as described in Accessing Properties.
「プロパティへのアクセス」で説明されているように、ドット (.
) 構文を使用してクラス インスタンスのプロパティにアクセスします。
Classes are reference types; instances of a class are referred to, rather than copied, when assigned to variables or constants, or when passed as arguments to a function call. For information about reference types, see Classes Are Reference Types.
クラスは参照型です。 クラスのインスタンスは、変数または定数に割り当てられるとき、または関数呼び出しに引数として渡されるときに、コピーされるのではなく参照されます。 参照型の詳細については、「クラスは参照型です」を参照してください。
You can extend the behavior of a class type with an extension declaration, as discussed in Extension Declaration.
「拡張宣言」で説明されているように、拡張宣言を使用してクラス型の動作を拡張できます。
Grammar of a class declaration
class-declaration → attributes? access-level-modifier? final
? class
class-name generic-parameter-clause? type-inheritance-clause? generic-where-clause? class-body
class-declaration → attributes? final
access-level-modifier? class
class-name generic-parameter-clause? type-inheritance-clause? generic-where-clause? class-body
class-name → identifier
class-body → {
class-members? }
class-members → class-member class-members?
class-member → declaration | compiler-control-statement
Actor Declaration
アクター宣言
An actor declaration introduces a named actor type into your program. Actor declarations are declared using the actor
keyword and have the following form:
アクター宣言は、名前付きアクター 型をプログラムに導入します。 アクターの宣言は、actor
キーワードを使用して宣言され、次の形式になります。
actor <#actor name#>: <#adopted protocols#> {
<#declarations#>
}
The body of an actor contains zero or more declarations. These declarations can include both stored and computed properties, instance methods, type methods, initializers, a single deinitializer, subscripts, type aliases, and even other class, structure, and enumeration declarations. For a discussion and several examples of actors that include various kinds of declarations, see Actors.
アクターの本文には 0 個以上の宣言が含まれています。 これらの宣言には、保存されたプロパティと計算されたプロパティの両方、インスタンス メソッド、型メソッド、初期化子、単一の初期化解除子、添字、型の別名、さらには他のクラス、構造体、列挙型の宣言を含めることができます。 さまざまな種類の宣言を含むアクターの説明といくつかの例については、「アクター」を参照してください。
Actor types can adopt any number of protocols, but can’t inherit from classes, enumerations, structures, or other actors. However, an actor that is marked with the @objc
attribute implicitly conforms to the NSObjectProtocol
protocol and is exposed to the Objective-C runtime as a subtype of NSObject
.
アクター 型は任意の数のプロトコルを採用できますが、クラス、列挙、構造、または他のアクターから継承することはできません。 ただし、@objc
属性でマークされたアクターは、NSObjectProtocol
プロトコルに暗黙的に準拠し、NSObject
のサブ型として Objective-C ランタイムに公開されます。
There are two ways to create an instance of a previously declared actor:
以前に宣言したアクターのインスタンスを作成するには、次の 2 つの方法があります。
- Call one of the initializers declared within the actor, as described in Initializers.
- 「初期化子」で説明されているように、アクター内で宣言されたイニシャライザの 1 つを呼び出します。
- If no initializers are declared, and all properties of the actor declaration were given initial values, call the actor’s default initializer, as described in Default Initializers.
- イニシャライザが宣言されておらず、アクター宣言のすべてのプロパティに初期値が指定されている場合は、「デフォルト イニシャライザ」で説明されているように、アクターのデフォルト イニシャライザを呼び出します。
By default, members of an actor are isolated to that actor. Code, such as the body of a method or the getter for a property, is executed on that actor. Code within the actor can interact with them synchronously because that code is already running on the same actor, but code outside the actor must mark them with await
to indicate that this code is asynchronously running code on another actor. Key paths can’t refer to isolated members of an actor. Actor-isolated stored properties can be passed as in-out parameters to synchronous functions, but not to asynchronous functions.
デフォルトでは、アクターのメンバーはそのアクターに隔離されています。 メソッドの本体やプロパティのゲッターなどのコードは、そのアクター上で実行されます。 アクター内のコードは、同じアクター上で既に実行されているため、アクターと同期的に対話できますが、アクターの外側のコードは、このコードが別のアクター上でコードを非同期的に実行していることを示すために、アクターに「await
」マークを付ける必要があります。 キー パスは、アクターの孤立したメンバーを参照することはできません。 アクター分離されたストアド プロパティは、入出力パラメータとして同期関数に渡すことができますが、非同期関数には渡すことができません。
Actors can also have nonisolated members, whose declarations are marked with the nonisolated
keyword. A nonisolated member executes like code outside of the actor: It can’t interact with any of the actor’s isolated state, and callers don’t mark it with await
when using it.
アクターは非分離メンバーを持つこともでき、その宣言にはnonisolated
キーワードが付けられます。 非分離メンバーはアクターの外部でコードのように実行されます。非分離メンバーはアクターのどの分離状態とも対話できず、呼び出し元は使用時に await
のマークを付けません。
Members of an actor can be marked with the @objc
attribute only if they are nonisolated or asynchronous.
アクターのメンバーは、非分離または非同期である場合にのみ @objc
属性でマークできます。
The process of initializing an actor’s declared properties is described in Initialization.
アクターの宣言されたプロパティを初期化するプロセスについては、「初期化」で説明されています。
Properties of an actor instance can be accessed using dot (.
) syntax, as described in Accessing Properties.
アクター インスタンスのプロパティには、「プロパティへのアクセス」で説明されているように、ドット (.
) 構文を使用してアクセスできます。
Actors are reference types; instances of an actor are referred to, rather than copied, when assigned to variables or constants, or when passed as arguments to a function call. For information about reference types, see Classes Are Reference Types.
アクターは参照型です。 アクターのインスタンスは、変数または定数に割り当てられるとき、または関数呼び出しに引数として渡されるときに、コピーされるのではなく参照されます。 参照型の詳細については、「クラスは参照型です」を参照してください。
You can extend the behavior of an actor type with an extension declaration, as discussed in Extension Declaration.
「拡張宣言」で説明されているように、拡張宣言を使用してアクター 型の動作を拡張できます。
Grammar of an actor declaration
actor-declaration → attributes? access-level-modifier? actor
actor-name generic-parameter-clause? type-inheritance-clause? generic-where-clause? actor-body
actor-name → identifier
actor-body → {
actor-members? }
actor-members → actor-member actor-members?
actor-member → declaration | compiler-control-statement
Protocol Declaration
プロトコル宣言
A protocol declaration introduces a named protocol type into your program. Protocol declarations are declared at global scope using the protocol
keyword and have the following form:
プロトコル宣言は、名前付きプロトコル 型をプログラムに導入します。 プロトコル宣言は、protocol
キーワードを使用してグローバル スコープで宣言され、次の形式になります。
protocol <#protocol name#>: <#inherited protocols#> {
<#protocol member declarations#>
}
The body of a protocol contains zero or more protocol member declarations, which describe the conformance requirements that any type adopting the protocol must fulfill. In particular, a protocol can declare that conforming types must implement certain properties, methods, initializers, and subscripts. Protocols can also declare special kinds of type aliases, called associated types, that can specify relationships among the various declarations of the protocol. Protocol declarations can’t contain class, structure, enumeration, or other protocol declarations. The protocol member declarations are discussed in detail below.
プロトコルの本文には、0 個以上のプロトコル メンバー宣言が含まれており、プロトコルを採用する型が満たさなければならない適合要件が記述されています。 特に、プロトコルは、準拠する型が特定のプロパティ、メソッド、イニシャライザ、およびサブスクリプトを実装する必要があることを宣言できます。 プロトコルは、プロトコルのさまざまな宣言間の関係を指定できる、関連型と呼ばれる特別な種類の型エイリアスを宣言することもできます。 プロトコル宣言には、クラス、構造体、列挙、またはその他のプロトコル宣言を含めることはできません。 プロトコルメンバー宣言については、以下で詳しく説明します。
Protocol types can inherit from any number of other protocols. When a protocol type inherits from other protocols, the set of requirements from those other protocols are aggregated, and any type that inherits from the current protocol must conform to all those requirements. For an example of how to use protocol inheritance, see Protocol Inheritance.
プロトコル 型は、他のプロトコルをいくつでも継承できます。 プロトコル 型が他のプロトコルから継承する場合、それらの他のプロトコルからの一連の要件が集約され、現在のプロトコルから継承する型はすべての要件に準拠する必要があります。 プロトコル継承の使用方法の例については、「プロトコルの継承」を参照してください。
Note
注釈
You can also aggregate the conformance requirements of multiple protocols using protocol composition types, as described in Protocol Composition Type and Protocol Composition.
「プロトコル構成型」と「プロトコル構成」で説明されているように、プロトコル構成を使用して複数のプロトコルの適合要件を集約することもできます。
You can add protocol conformance to a previously declared type by adopting the protocol in an extension declaration of that type. In the extension, you must implement all of the adopted protocol’s requirements. If the type already implements all of the requirements, you can leave the body of the extension declaration empty.
以前に宣言された型にプロトコル準拠を追加するには、その型の拡張宣言でプロトコルを採用します。 拡張機能では、採用されたプロトコルの要件をすべて実装する必要があります。 型がすべての要件をすでに実装している場合は、拡張宣言の本文を空のままにすることができます。
By default, types that conform to a protocol must implement all properties, methods, and subscripts declared in the protocol. That said, you can mark these protocol member declarations with the optional
declaration modifier to specify that their implementation by a conforming type is optional. The optional
modifier can be applied only to members that are marked with the objc
attribute, and only to members of protocols that are marked with the objc
attribute. As a result, only class types can adopt and conform to a protocol that contains optional member requirements. For more information about how to use the optional
declaration modifier and for guidance about how to access optional protocol members — for example, when you’re not sure whether a conforming type implements them — see Optional Protocol Requirements.
デフォルトでは、プロトコルに準拠する型は、プロトコルで宣言されたすべてのプロパティ、メソッド、および添字を実装する必要があります。 ただし、これらのプロトコル メンバー宣言をoptional
宣言修飾子でマークして、準拠する型による実装がオプションであることを指定できます。optional
修飾子は、objc
属性でマークされたメンバー、および objc
属性でマークされたプロトコルのメンバーにのみ適用できます。 その結果、クラス型のみが、オプションのメンバー要件を含むプロトコルを採用し、準拠することができます。 optional
宣言修飾子の使用方法の詳細と、オプションのプロトコル メンバーにアクセスする方法に関するガイダンス(たとえば、適合する型がそれらを実装しているかどうかわからない場合)については、「オプションのプロトコル要件」を参照してください。
The cases of an enumeration can satisfy protocol requirements for type members. Specifically, an enumeration case without any associated values satisfies a protocol requirement for a get-only type variable of type Self
, and an enumeration case with associated values satisfies a protocol requirement for a function that returns Self
whose parameters and their argument labels match the case’s associated values. For example:
列挙型のケースは、型メンバーのプロトコル要件を満たすことができます。 具体的には、関連付けられた値のない列挙型ケースは、Self
型の取得専用型変数のプロトコル要件を満たし、関連付けられた値を持つ列挙型ケースは、パラメーターとその引数ラベルがケースの関連する値と一致する Self
を返す関数のプロトコル要件を満たします。 例えば:
protocol SomeProtocol {
static var someValue: Self { get }
static func someFunction(x: Int) -> Self
}
enum MyEnum: SomeProtocol {
case someValue
case someFunction(x: Int)
}
To restrict the adoption of a protocol to class types only, include the AnyObject
protocol in the inherited protocols list after the colon. For example, the following protocol can be adopted only by class types:
プロトコルの採用をクラス型のみに制限するには、継承プロトコルリストのコロンの後に AnyObject
プロトコルを含めます。 たとえば、次のプロトコルはクラス 型でのみ採用できます。
protocol SomeProtocol: AnyObject {
/* Protocol members go here */
}
Any protocol that inherits from a protocol that’s marked with the AnyObject
requirement can likewise be adopted only by class types.
AnyObject
要件がマークされたプロトコルを継承するプロトコルは、同様にクラス 型でのみ採用できます。
Note
注釈
If a protocol is marked with the objc
attribute, the AnyObject
requirement is implicitly applied to that protocol; there’s no need to mark the protocol with the AnyObject
requirement explicitly.
プロトコルが objc
属性でマークされている場合、AnyObject
要件はそのプロトコルに暗黙的に適用されます。 プロトコルに AnyObject
要件を明示的にマークする必要はありません。
Protocols are named types, and thus they can appear in all the same places in your code as other named types, as discussed in Protocols as Types. However, you can’t construct an instance of a protocol, because protocols don’t actually provide the implementations for the requirements they specify.
プロトコルは名前付き型であるため、型としてのプロトコルで説明されているように、コード内の他の名前付き型と同じ場所に出現できます。 ただし、プロトコルは指定された要件の実装を実際には提供しないため、プロトコルのインスタンスを構築することはできません。
You can use protocols to declare which methods a delegate of a class or structure should implement, as described in Delegation.
「 委任」で説明されているように、プロトコルを使用して、クラスまたは構造のデリゲートが実装する必要があるメソッドを宣言できます。
Grammar of a protocol declaration
protocol-declaration → attributes? access-level-modifier? protocol
protocol-name type-inheritance-clause? generic-where-clause? protocol-body
protocol-name → identifier
protocol-body → {
protocol-members? }
protocol-members → protocol-member protocol-members?
protocol-member → protocol-member-declaration | compiler-control-statement
protocol-member-declaration → protocol-property-declaration
protocol-member-declaration → protocol-method-declaration
protocol-member-declaration → protocol-initializer-declaration
protocol-member-declaration → protocol-subscript-declaration
protocol-member-declaration → protocol-associated-type-declaration
protocol-member-declaration → typealias-declaration
Protocol Property Declaration
プロトコルプロパティの宣言
Protocols declare that conforming types must implement a property by including a protocol property declaration in the body of the protocol declaration. Protocol property declarations have a special form of a variable declaration:
プロトコルは、プロトコル宣言の本文にプロトコル プロパティ宣言を含めることによって、準拠する型がプロパティを実装する必要があることを宣言します。 プロトコル プロパティの宣言には、特別な形式の変数宣言があります。
var <#property name#>: <#type#> { get set }
As with other protocol member declarations, these property declarations declare only the getter and setter requirements for types that conform to the protocol. As a result, you don’t implement the getter or setter directly in the protocol in which it’s declared.
他のプロトコル メンバー宣言と同様に、これらのプロパティ宣言では、プロトコルに準拠する型のゲッターとセッターの要件のみを宣言します。 その結果、ゲッターやセッターを宣言されているプロトコルに直接実装することはありません。
The getter and setter requirements can be satisfied by a conforming type in a variety of ways. If a property declaration includes both the get
and set
keywords, a conforming type can implement it with a stored variable property or a computed property that’s both readable and writeable (that is, one that implements both a getter and a setter). However, that property declaration can’t be implemented as a constant property or a read-only computed property. If a property declaration includes only the get
keyword, it can be implemented as any kind of property. For examples of conforming types that implement the property requirements of a protocol, see Property Requirements.
ゲッターとセッターの要件は、適合する型によってさまざまな方法で満たすことができます。 プロパティ宣言に get
キーワードと set
キーワードの両方が含まれている場合、適合する型は、読み取りと書き込みの両方が可能な格納変数プロパティまたは計算プロパティ (つまり、ゲッターとセッターの両方を実装するもの) を使用してそれを実装できます。 ただし、そのプロパティ宣言を定数プロパティまたは読み取り専用の計算プロパティとして実装することはできません。 プロパティ宣言に get
キーワードのみが含まれている場合は、任意の種類のプロパティとして実装できます。 プロトコルのプロパティ要件を実装する適合型の例については、「プロパティの要件」を参照してください。
To declare a type property requirement in a protocol declaration, mark the property declaration with the static
keyword. Structures and enumerations that conform to the protocol declare the property with the static
keyword, and classes that conform to the protocol declare the property with either the static
or class
keyword. Extensions that add protocol conformance to a structure, enumeration, or class use the same keyword as the type they extend uses. Extensions that provide a default implementation for a type property requirement use the static
keyword.
プロトコル宣言で型 プロパティ要件を宣言するには、プロパティ宣言を static
キーワードでマークします。 プロトコルに準拠する構造体と列挙型は static
キーワードを使用してプロパティを宣言し、プロトコルに準拠するクラスは static
または class
キーワードのいずれかを使用してプロパティを宣言します。 構造体、列挙型、またはクラスにプロトコル準拠を追加する拡張機能は、拡張で使用する型と同じキーワードを使用します。 型 プロパティ要件のデフォルト実装を提供する拡張機能は、static
キーワードを使用します。
See also Variable Declaration.
「変数の宣言」も参照してください。
Grammar of a protocol property declaration
protocol-property-declaration → variable-declaration-head variable-name type-annotation getter-setter-keyword-block
Protocol Method Declaration
プロトコルメソッド宣言
Protocols declare that conforming types must implement a method by including a protocol method declaration in the body of the protocol declaration. Protocol method declarations have the same form as function declarations, with two exceptions: They don’t include a function body, and you can’t provide any default parameter values as part of the function declaration. For examples of conforming types that implement the method requirements of a protocol, see Method Requirements.
プロトコルは、プロトコル宣言の本体にプロトコル メソッド宣言を含めることによって、準拠する型がメソッドを実装する必要があることを宣言します。 プロトコル メソッド宣言は関数宣言と同じ形式ですが、次の 2 つの例外があります。1 つは関数本体が含まれていないこと、もう 1 つは関数宣言の一部としてデフォルトのパラメーター値を指定できないことです。 プロトコルのメソッド要件を実装する適合型の例については、「メソッドの要件」を参照してください。
To declare a class or static method requirement in a protocol declaration, mark the method declaration with the static
declaration modifier. Structures and enumerations that conform to the protocol declare the method with the static
keyword, and classes that conform to the protocol declare the method with either the static
or class
keyword. Extensions that add protocol conformance to a structure, enumeration, or class use the same keyword as the type they extend uses. Extensions that provide a default implementation for a type method requirement use the static
keyword.
プロトコル宣言でクラスまたは静的メソッドの要件を宣言するには、メソッド宣言を静的宣言修飾子でマークします。 プロトコルに準拠する構造体と列挙型は static
キーワードを使用してメソッドを宣言し、プロトコルに準拠するクラスは static
キーワードまたは class
キーワードを使用してメソッドを宣言します。 構造体、列挙型、またはクラスにプロトコル準拠を追加する拡張機能は、拡張で使用する型と同じキーワードを使用します。 型メソッド要件のデフォルト実装を提供する拡張機能は、static
キーワードを使用します。
See also Function Declaration.
「関数の宣言」も参照してください。
Grammar of a protocol method declaration
protocol-method-declaration → function-head function-name generic-parameter-clause? function-signature generic-where-clause?
Protocol Initializer Declaration
プロトコル初期化子の宣言
Protocols declare that conforming types must implement an initializer by including a protocol initializer declaration in the body of the protocol declaration. Protocol initializer declarations have the same form as initializer declarations, except they don’t include the initializer’s body.
プロトコルは、プロトコル宣言の本文にプロトコル初期化子宣言を含めることによって、準拠する型が初期化子を実装する必要があることを宣言します。 プロトコル初期化子宣言は、初期化子宣言と同じ形式ですが、初期化子本体が含まれない点が異なります。
A conforming type can satisfy a nonfailable protocol initializer requirement by implementing a nonfailable initializer or an init!
failable initializer. A conforming type can satisfy a failable protocol initializer requirement by implementing any kind of initializer.
適合する型は、失敗不可能 イニシャライザまたは init!
を実装することで、失敗不可能 プロトコル イニシャライザの要件を満たすことができます。 適合する型は、任意の種類のイニシャライザを実装することで、失敗可能なプロトコル初期化子の要件を満たすことができます。
When a class implements an initializer to satisfy a protocol’s initializer requirement, the initializer must be marked with the required
declaration modifier if the class isn’t already marked with the final
declaration modifier.
プロトコルのイニシャライザ要件を満たすためにクラスがイニシャライザを実装する場合、クラスがまだfinal
宣言修飾子でマークされていない場合は、イニシャライザをrequired
宣言修飾子でマークする必要があります。
See also Initializer Declaration.
「イニシャライザ宣言」も参照してください。
Grammar of a protocol initializer declaration
protocol-initializer-declaration → initializer-head generic-parameter-clause? parameter-clause throws
? generic-where-clause?
protocol-initializer-declaration → initializer-head generic-parameter-clause? parameter-clause rethrows
generic-where-clause?
Protocol Subscript Declaration
プロトコルの添字宣言
Protocols declare that conforming types must implement a subscript by including a protocol subscript declaration in the body of the protocol declaration. Protocol subscript declarations have a special form of a subscript declaration:
プロトコルは、プロトコル宣言の本文にプロトコル添字宣言を含めることによって、準拠する型が添字を実装する必要があることを宣言します。 プロトコルの添字宣言には、特殊な形式の添字宣言があります。
subscript (<#parameters#>) -> <#return type#> { get set }
Subscript declarations only declare the minimum getter and setter implementation requirements for types that conform to the protocol. If the subscript declaration includes both the get
and set
keywords, a conforming type must implement both a getter and a setter clause. If the subscript declaration includes only the get
keyword, a conforming type must implement at least a getter clause and optionally can implement a setter clause.
添字宣言は、プロトコルに準拠する型のゲッターおよびセッターの最小限の実装要件のみを宣言します。 添字宣言に get
キーワードと set
キーワードの両方が含まれている場合、適合する型はゲッター句とセッター句の両方を実装する必要があります。 添字宣言に get
キーワードのみが含まれている場合、適合する型は少なくとも ゲッター 句を実装する必要があり、オプションで セッター 句を実装できます。
To declare a static subscript requirement in a protocol declaration, mark the subscript declaration with the static
declaration modifier. Structures and enumerations that conform to the protocol declare the subscript with the static
keyword, and classes that conform to the protocol declare the subscript with either the static
or class
keyword. Extensions that add protocol conformance to a structure, enumeration, or class use the same keyword as the type they extend uses. Extensions that provide a default implementation for a static subscript requirement use the static
keyword.
プロトコル宣言で静的な添字要件を宣言するには、static
宣言修飾子で添字宣言をマークします。 プロトコルに準拠する構造体と列挙型は static
キーワードを使用して添え字を宣言し、プロトコルに準拠するクラスは static
または class
キーワードを使用して添え字を宣言します。 構造体、列挙型、またはクラスにプロトコル準拠を追加する拡張機能は、拡張で使用する型と同じキーワードを使用します。 静的な添字要件のデフォルト実装を提供する拡張機能では、static
キーワードを使用します。
See also Subscript Declaration.
「添字の宣言」も参照してください。
Grammar of a protocol subscript declaration
protocol-subscript-declaration → subscript-head subscript-result generic-where-clause? getter-setter-keyword-block
Protocol Associated Type Declaration
プロトコル関連型の宣言
Protocols declare associated types using the associatedtype
keyword. An associated type provides an alias for a type that’s used as part of a protocol’s declaration. Associated types are similar to type parameters in generic parameter clauses, but they’re associated with Self
in the protocol in which they’re declared. In that context, Self
refers to the eventual type that conforms to the protocol. For more information and examples, see Associated Types.
プロトコルは、associatedtype
キーワードを使用して関連型を宣言します。 関連型は、プロトコルの宣言の一部として使用される型のエイリアスを提供します。 関連付けられた型は、汎用パラメータ句の型パラメータに似ていますが、宣言されているプロトコル内の Self
に関連付けられます。 その文脈では、「Self
」はプロトコルに準拠する最終的な型を指します。 詳細と例については、「関連する型」を参照してください。
You use a generic where
clause in a protocol declaration to add constraints to an associated types inherited from another protocol, without redeclaring the associated types. For example, the declarations of SubProtocol
below are equivalent:
プロトコル宣言で汎用の where
句を使用すると、関連する型を再宣言せずに、別のプロトコルから継承した関連する型に制約を追加できます。 たとえば、以下のSubProtocol
の宣言は同等です。
protocol SomeProtocol {
associatedtype SomeType
}
protocol SubProtocolA: SomeProtocol {
// This syntax produces a warning.
associatedtype SomeType: Equatable
}
// This syntax is preferred.
protocol SubProtocolB: SomeProtocol where SomeType: Equatable { }
See also Type Alias Declaration.
「型エイリアスの宣言」も参照してください。
Grammar of a protocol associated type declaration
protocol-associated-type-declaration → attributes? access-level-modifier? associatedtype
typealias-name type-inheritance-clause? typealias-assignment? generic-where-clause?
Initializer Declaration
イニシャライザ宣言
An initializer declaration introduces an initializer for a class, structure, or enumeration into your program. Initializer declarations are declared using the init
keyword and have two basic forms.
イニシャライザ宣言は、クラス、構造体、列挙型のイニシャライザをプログラムに導入します。 イニシャライザの宣言は init
キーワードを使用して宣言され、2 つの基本形式があります。
Structure, enumeration, and class types can have any number of initializers, but the rules and associated behavior for class initializers are different. Unlike structures and enumerations, classes have two kinds of initializers: designated initializers and convenience initializers, as described in Initialization.
構造型、列挙型、およびクラス型には任意の数の初期化子を含めることができますが、クラス初期化子の規則と関連する動作は異なります。 構造体や列挙型とは異なり、「初期化」で説明されているように、クラスには指定イニシャライザとコンビニエンス イニシャライザの 2 種類のイニシャライザがあります。
The following form declares initializers for structures, enumerations, and designated initializers of classes:
次の形式は、構造体の初期化子、列挙型、およびクラスの指定された初期化子を宣言します。
init(<#parameters#>) {
<#statements#>
}
A designated initializer of a class initializes all of the class’s properties directly. It can’t call any other initializers of the same class, and if the class has a superclass, it must call one of the superclass’s designated initializers. If the class inherits any properties from its superclass, one of the superclass’s designated initializers must be called before any of these properties can be set or modified in the current class.
クラスの指定された初期化子は、クラスのすべてのプロパティを直接初期化します。 同じクラスの他のイニシャライザを呼び出すことはできません。クラスにスーパークラスがある場合は、スーパークラスに指定されたイニシャライザの 1 つを呼び出す必要があります。 クラスがスーパークラスからプロパティを継承する場合、現在のクラスでこれらのプロパティを設定または変更する前に、スーパークラスに指定されたイニシャライザの 1 つを呼び出す必要があります。
Designated initializers can be declared in the context of a class declaration only and therefore can’t be added to a class using an extension declaration.
指定された初期化子はクラス宣言のコンテキストでのみ宣言できるため、拡張宣言を使用してクラスに追加することはできません。
Initializers in structures and enumerations can call other declared initializers to delegate part or all of the initialization process.
構造体および列挙型のイニシャライザは、他の宣言されたイニシャライザを呼び出して、初期化プロセスの一部またはすべてを委任できます。
To declare convenience initializers for a class, mark the initializer declaration with the convenience
declaration modifier.
クラスのコンビニエンス イニシャライザを宣言するには、イニシャライザ宣言をconvenience
宣言修飾子でマークします。
convenience init(<#parameters#>) {
<#statements#>
}
Convenience initializers can delegate the initialization process to another convenience initializer or to one of the class’s designated initializers. That said, the initialization processes must end with a call to a designated initializer that ultimately initializes the class’s properties. Convenience initializers can’t call a superclass’s initializers.
コンビニエンス イニシャライザは、初期化プロセスを別のコンビニエンス イニシャライザまたはクラスで指定されたイニシャライザの 1 つに委任できます。 ただし、初期化プロセスは、最終的にクラスのプロパティを初期化する、指定されたイニシャライザの呼び出しで終了する必要があります。 コンビニエンス イニシャライザはスーパークラスのイニシャライザを呼び出すことができません。
You can mark designated and convenience initializers with the required
declaration modifier to require that every subclass implement the initializer. A subclass’s implementation of that initializer must also be marked with the required
declaration modifier.
指定された便利なイニシャライザをrequired
宣言修飾子でマークして、すべてのサブクラスにイニシャライザの実装を要求できます。 そのイニシャライザのサブクラスの実装も、required
宣言修飾子でマークする必要があります。
By default, initializers declared in a superclass aren’t inherited by subclasses. That said, if a subclass initializes all of its stored properties with default values and doesn’t define any initializers of its own, it inherits all of the superclass’s initializers. If the subclass overrides all of the superclass’s designated initializers, it inherits the superclass’s convenience initializers.
デフォルトでは、スーパークラスで宣言されたイニシャライザはサブクラスに継承されません。 ただし、サブクラスが、保存されているプロパティをすべてデフォルト値で初期化し、独自のイニシャライザを定義していない場合は、スーパークラスのすべてのイニシャライザを継承します。 サブクラスがスーパークラスの指定されたイニシャライザをすべてオーバーライドする場合、サブクラスはスーパークラスのコンビニエンス イニシャライザを継承します。
As with methods, properties, and subscripts, you need to mark overridden designated initializers with the override
declaration modifier.
メソッド、プロパティ、添字と同様に、オーバーライドされた指定されたイニシャライザをoverride
宣言修飾子でマークする必要があります。
Note
注釈
If you mark an initializer with the required
declaration modifier, you don’t also mark the initializer with the override
modifier when you override the required initializer in a subclass.
required
宣言修飾子でイニシャライザをマークすると、サブクラスで必須のイニシャライザをオーバーライドするときに、イニシャライザを override
修飾子でマークすることもありません。
Just like functions and methods, initializers can throw or rethrow errors. And just like functions and methods, you use the throws
or rethrows
keyword after an initializer’s parameters to indicate the appropriate behavior. Likewise, initializers can be asynchronous, and you use the async
keyword to indicate this.
関数やメソッドと同様に、イニシャライザはエラーをスローまたは再スローすることができます。 また、関数やメソッドと同様に、イニシャライザのパラメータの後に throws
または rethrows
キーワードを使用して、適切な動作を示します。 同様に、イニシャライザは非同期にすることができ、これを示すには async
キーワードを使用します。
To see examples of initializers in various type declarations, see Initialization.
さまざまな型宣言での初期化子の例については、「初期化」を参照してください。
Failable Initializers
失敗可能なイニシャライザ
A failable initializer is a type of initializer that produces an optional instance or an implicitly unwrapped optional instance of the type the initializer is declared on. As a result, a failable initializer can return nil
to indicate that initialization failed.
失敗可能なイニシャライザは、イニシャライザが宣言されている型のオプションのインスタンス、または暗黙的にアンラップされたオプションのインスタンスを生成するイニシャライザの型です。 その結果、失敗可能なイニシャライザは初期化が失敗したことを示す nil
を返す可能性があります。
To declare a failable initializer that produces an optional instance, append a question mark to the init
keyword in the initializer declaration (init?
). To declare a failable initializer that produces an implicitly unwrapped optional instance, append an exclamation point instead (init!
). The example below shows an init?
failable initializer that produces an optional instance of a structure.
オプションのインスタンスを生成する失敗可能なイニシャライザを宣言するには、イニシャライザ宣言の init
キーワードに疑問符を追加します (init?
)。 暗黙的にアンラップされたオプションのインスタンスを生成する失敗可能なイニシャライザを宣言するには、代わりに感嘆符を追加します (init!
)。 以下の例は、init?
を示しています。 構造体のオプションのインスタンスを生成する失敗可能なイニシャライザ。
struct SomeStruct {
let property: String
// produces an optional instance of 'SomeStruct'
init?(input: String) {
if input.isEmpty {
// discard 'self' and return 'nil'
return nil
}
property = input
}
}
You call an init?
failable initializer in the same way that you call a nonfailable initializer, except that you must deal with the optionality of the result.
結果のオプション性を処理する必要があることを除いて、失敗しないイニシャライザを呼び出すのと同じ方法で、失敗可能なイニシャライザinit?
を呼び出します。
if let actualInstance = SomeStruct(input: "Hello") {
// do something with the instance of 'SomeStruct'
} else {
// initialization of 'SomeStruct' failed and the initializer returned 'nil'
}
A failable initializer can return nil
at any point in the implementation of the initializer’s body.
失敗可能なイニシャライザは、イニシャライザ本体の実装のどの時点でも nil
を返す可能性があります。
A failable initializer can delegate to any kind of initializer. A nonfailable initializer can delegate to another nonfailable initializer or to an init!
failable initializer. A nonfailable initializer can delegate to an init?
failable initializer by force-unwrapping the result of the superclass’s initializer — for example, by writing super.init()!
.
失敗可能なイニシャライザは、あらゆる種類のイニシャライザに委任できます。 失敗しないイニシャライザは、別の失敗しないイニシャライザまたは init!
に委任できます。 失敗可能なイニシャライザ。 失敗しないイニシャライザは init?
に委任できます。 スーパークラスのイニシャライザの結果を強制的にアンラップすることにより、失敗可能なイニシャライザを設定します。たとえば、super.init()!
と記述します。
Initialization failure propagates through initializer delegation. Specifically, if a failable initializer delegates to an initializer that fails and returns nil
, then the initializer that delegated also fails and implicitly returns nil
. If a nonfailable initializer delegates to an init!
failable initializer that fails and returns nil
, then a runtime error is raised (as if you used the !
operator to unwrap an optional that has a nil
value).
初期化の失敗は、初期化子の委任を通じて伝播します。 具体的には、失敗可能なイニシャライザが失敗して nil
を返すイニシャライザに委任すると、委任されたイニシャライザも失敗して暗黙的に nil
を返します。 失敗しないイニシャライザが init!
に委任する場合 失敗可能なイニシャライザが失敗して nil
を返すと、ランタイム エラーが発生します(nil
値を持つオプションをアンラップするために !
演算子を使用した場合と同様)。
A failable designated initializer can be overridden in a subclass by any kind of designated initializer. A nonfailable designated initializer can be overridden in a subclass by a nonfailable designated initializer only.
失敗可能な指定イニシャライザは、サブクラス内で任意の種類の指定イニシャライザによってオーバーライドできます。 失敗しない指定イニシャライザは、サブクラス内で失敗しない指定イニシャライザによってのみオーバーライドできます。
For more information and to see examples of failable initializers, see Failable Initializers.
失敗可能なイニシャライザの詳細と例については、「失敗可能なイニシャライザ」を参照してください。
Grammar of an initializer declaration
initializer-declaration → initializer-head generic-parameter-clause? parameter-clause async
? throws
? generic-where-clause? initializer-body
initializer-declaration → initializer-head generic-parameter-clause? parameter-clause async
? rethrows
generic-where-clause? initializer-body
initializer-head → attributes? declaration-modifiers? init
initializer-head → attributes? declaration-modifiers? init
?
initializer-head → attributes? declaration-modifiers? init
!
initializer-body → code-block
Deinitializer Declaration
初期化解除宣言
A deinitializer declaration declares a deinitializer for a class type. Deinitializers take no parameters and have the following form:
初期化解除子宣言では、クラス型の初期化解除子を宣言します。 初期化解除子はパラメータをとらず、次の形式になります。
deinit {
<#statements#>
}
A deinitializer is called automatically when there are no longer any references to a class object, just before the class object is deallocated. A deinitializer can be declared only in the body of a class declaration — but not in an extension of a class — and each class can have at most one.
初期化解除子は、クラス オブジェクトへの参照がなくなったとき、クラス オブジェクトの割り当てが解除される直前に自動的に呼び出されます。 初期化解除子はクラス宣言の本体内でのみ宣言できますが、クラスの拡張内では宣言できません。各クラスは最大 1 つを持つことができます。
A subclass inherits its superclass’s deinitializer, which is implicitly called just before the subclass object is deallocated. The subclass object isn’t deallocated until all deinitializers in its inheritance chain have finished executing.
サブクラスは、そのスーパークラスの初期化解除子を継承します。この初期化解除子は、サブクラス オブジェクトの割り当てが解除される直前に暗黙的に呼び出されます。 サブクラス オブジェクトは、その継承チェーン内のすべての初期化解除子が実行を完了するまで割り当て解除されません。
Deinitializers aren’t called directly.
初期化解除子は直接呼び出されません。
For an example of how to use a deinitializer in a class declaration, see Deinitialization.
クラス宣言で初期化解除子を使用する方法の例については、「初期化解除」を参照してください。
Grammar of a deinitializer declaration
deinitializer-declaration → attributes? deinit
code-block
Extension Declaration
拡張宣言
An extension declaration allows you to extend the behavior of existing types. Extension declarations are declared using the extension
keyword and have the following form:
拡張宣言を使用すると、既存の型の動作を拡張できます。 拡張機能の宣言は、extension
キーワードを使用して宣言され、次の形式になります。
extension <#type name#> where <#requirements#> {
<#declarations#>
}
The body of an extension declaration contains zero or more declarations. These declarations can include computed properties, computed type properties, instance methods, type methods, initializers, subscript declarations, and even class, structure, and enumeration declarations. Extension declarations can’t contain deinitializer or protocol declarations, stored properties, property observers, or other extension declarations. Declarations in a protocol extension can’t be marked final
. For a discussion and several examples of extensions that include various kinds of declarations, see Extensions.
拡張宣言の本文には 0 個以上の宣言が含まれます。 これらの宣言には、計算プロパティ、計算型プロパティ、インスタンス メソッド、型メソッド、イニシャライザ、添字宣言、さらにはクラス、構造体、列挙型の宣言を含めることができます。 拡張機能の宣言には、初期化解除子またはプロトコルの宣言、ストアド プロパティ、プロパティ オブザーバー、またはその他の拡張機能の宣言を含めることはできません。 プロトコル拡張内の宣言をfinal
としてマークすることはできません。 さまざまな種類の宣言を含む拡張機能の説明といくつかの例については、「拡張機能」を参照してください。
If the type name is a class, structure, or enumeration type, the extension extends that type. If the type name is a protocol type, the extension extends all types that conform to that protocol.
型名がクラス、構造体、または列挙型の場合、拡張機能はその型を拡張します。 型名がプロトコル 型の場合、拡張機能はそのプロトコルに準拠するすべての型を拡張します。
Extension declarations that extend a generic type or a protocol with associated types can include requirements. If an instance of the extended type or of a type that conforms to the extended protocol satisfies the requirements, the instance gains the behavior specified in the declaration.
ジェネリック型または関連する型を持つプロトコルを拡張する拡張宣言には、要件を含めることができます。 拡張型のインスタンス、または拡張プロトコルに準拠する型のインスタンスが要件を満たしている場合、そのインスタンスは宣言で指定された動作を取得します。
Extension declarations can contain initializer declarations. That said, if the type you’re extending is defined in another module, an initializer declaration must delegate to an initializer already defined in that module to ensure members of that type are properly initialized.
拡張宣言には初期化子の宣言を含めることができます。 ただし、拡張している型が別のモジュールで定義されている場合は、その型のメンバーが適切に初期化されるように、イニシャライザ宣言はそのモジュールですでに定義されているイニシャライザに委任する必要があります。
Properties, methods, and initializers of an existing type can’t be overridden in an extension of that type.
既存の型のプロパティ、メソッド、初期化子は、その型の拡張機能でオーバーライドできません。
Extension declarations can add protocol conformance to an existing class, structure, or enumeration type by specifying adopted protocols:
拡張宣言では、採用されるプロトコルを指定することで、既存のクラス、構造、または列挙型にプロトコル準拠を追加できます。
extension <#type name#>: <#adopted protocols#> where <#requirements#> {
<#declarations#>
}
Extension declarations can’t add class inheritance to an existing class, and therefore you can specify only a list of protocols after the type name and colon.
拡張宣言では既存のクラスにクラス継承を追加できないため、型名とコロンの後にはプロトコルのリストのみを指定できます。
Conditional Conformance
条件付き適合
You can extend a generic type to conditionally conform to a protocol, so that instances of the type conform to the protocol only when certain requirements are met. You add conditional conformance to a protocol by including requirements in an extension declaration.
条件付きでプロトコルに準拠するようにジェネリック型を拡張して、特定の要件が満たされた場合にのみ型のインスタンスがプロトコルに準拠するようにすることができます。 拡張宣言に要件を含めることで、プロトコルに条件付き準拠を追加します。
Overridden Requirements Aren’t Used in Some Generic Contexts
オーバーライドされた要件が一部の一般的なコンテキストでは使用されない
In some generic contexts, types that get behavior from conditional conformance to a protocol don’t always use the specialized implementations of that protocol’s requirements. To illustrate this behavior, the following example defines two protocols and a generic type that conditionally conforms to both protocols.
一部の汎用コンテキストでは、プロトコルへの条件準拠から動作を取得する型は、そのプロトコルの要件の特殊な実装を常に使用するとは限りません。 この動作を説明するために、次の例では 2 つのプロトコルと、条件付きで両方のプロトコルに準拠するジェネリック型を定義します。
protocol Loggable {
func log()
}
extension Loggable {
func log() {
print(self)
}
}
protocol TitledLoggable: Loggable {
static var logTitle: String { get }
}
extension TitledLoggable {
func log() {
print("\(Self.logTitle): \(self)")
}
}
struct Pair<T>: CustomStringConvertible {
let first: T
let second: T
var description: String {
return "(\(first), \(second))"
}
}
extension Pair: Loggable where T: Loggable { }
extension Pair: TitledLoggable where T: TitledLoggable {
static var logTitle: String {
return "Pair of '\(T.logTitle)'"
}
}
extension String: TitledLoggable {
static var logTitle: String {
return "String"
}
}
The Pair
structure conforms to Loggable
and TitledLoggable
whenever its generic type conforms to Loggable
or TitledLoggable
, respectively. In the example below, oneAndTwo
is an instance of Pair<String>
, which conforms to TitledLoggable
because String
conforms to TitledLoggable
. When the log()
method is called on oneAndTwo
directly, the specialized version containing the title string is used.
Pair
構造は、そのジェネリック 型がそれぞれ Loggable
または TitledLoggable
に準拠する場合、Loggable
および TitledLoggable
に準拠します。 以下の例では、oneAndTwo
はPair<String>
のインスタンスであり、String
は TitledLoggable
に準拠しているため、これは TitledLoggable
に準拠しています。 log()
メソッドが oneAndTwo
で直接呼び出される場合、タイトル文字列を含む特殊なバージョンが使用されます。
let oneAndTwo = Pair(first: "one", second: "two")
oneAndTwo.log()
// Prints "Pair of 'String': (one, two)"
However, when oneAndTwo
is used in a generic context or as an instance of the Loggable
protocol, the specialized version isn’t used. Swift picks which implementation of log()
to call by consulting only the minimum requirements that Pair
needs to conform to Loggable
. For this reason, the default implementation provided by the Loggable
protocol is used instead.
ただし、oneAndTwo
が汎用コンテキストで使用される場合、または Loggable
プロトコルのインスタンスとして使用される場合、特殊なバージョンは使用されません。 Swift は、Pair
が Loggable
に準拠するために必要な最小限の要件のみを参照して、呼び出す log()
の実装を選択します。 このため、Loggable
プロトコルによって提供されるデフォルトの実装が代わりに使用されます。
func doSomething<T: Loggable>(with x: T) {
x.log()
}
doSomething(with: oneAndTwo)
// Prints "(one, two)"
When log()
is called on the instance that’s passed to doSomething(_:)
, the customized title is omitted from the logged string.
doSomething(_:)
に渡されるインスタンスで log()
が呼び出される場合、カスタマイズされたタイトルはログに記録される文字列から省略されます。
Protocol Conformance Must Not Be Redundant
プロトコルへの準拠は冗長であってはなりません
A concrete type can conform to a particular protocol only once. Swift marks redundant protocol conformances as an error. You’re likely to encounter this kind of error in two kinds of situations. The first situation is when you explicitly conform to the same protocol multiple times, but with different requirements. The second situation is when you implicitly inherit from the same protocol multiple times. These situations are discussed in the sections below.
具象型は、特定のプロトコルに一度だけ準拠できます。 Swift は、冗長なプロトコル準拠をエラーとしてマークします。 この種のエラーは、2 種類の状況で発生する可能性があります。 1 つ目の状況は、同じプロトコルに複数回明示的に準拠しているが、要件は異なる場合です。 2 番目の状況は、同じプロトコルを暗黙的に複数回継承する場合です。 これらの状況については、以下のセクションで説明します。
Resolving Explicit Redundancy
明示的な重複の解決
Multiple extensions on a concrete type can’t add conformance to the same protocol, even if the extensions’ requirements are mutually exclusive. This restriction is demonstrated in the example below. Two extension declarations attempt to add conditional conformance to the Serializable
protocol, one for arrays with Int
elements, and one for arrays with String
elements.
拡張機能の要件が相互に排他的である場合でも、具象型の複数の拡張機能は同じプロトコルへの準拠を追加できません。 この制限については、以下の例で説明します。 2 つの拡張宣言は、Serializable
プロトコルに条件付き準拠を追加しようとします。1 つは Int
要素を含む配列用で、もう 1 つは String
要素を含む配列用です。
protocol Serializable {
func serialize() -> Any
}
extension Array: Serializable where Element == Int {
func serialize() -> Any {
// implementation
}
}
extension Array: Serializable where Element == String {
func serialize() -> Any {
// implementation
}
}
// Error: redundant conformance of 'Array<Element>' to protocol 'Serializable'
If you need to add conditional conformance based on multiple concrete types, create a new protocol that each type can conform to and use that protocol as the requirement when declaring conditional conformance.
複数の具象型に基づいて条件適合を追加する必要がある場合は、各型が適合できる新しいプロトコルを作成し、条件適合を宣言するときにそのプロトコルを要件として使用します。
protocol SerializableInArray { }
extension Int: SerializableInArray { }
extension String: SerializableInArray { }
extension Array: Serializable where Element: SerializableInArray {
func serialize() -> Any {
// implementation
}
}
Resolving Implicit Redundancy
暗黙的な重複の解決
When a concrete type conditionally conforms to a protocol, that type implicitly conforms to any parent protocols with the same requirements.
具象型が条件付きでプロトコルに準拠する場合、その型は同じ要件を持つ親プロトコルに暗黙的に準拠します。
If you need a type to conditionally conform to two protocols that inherit from a single parent, explicitly declare conformance to the parent protocol. This avoids implicitly conforming to the parent protocol twice with different requirements.
単一の親から継承する 2 つのプロトコルに条件付きで準拠する型が必要な場合は、親プロトコルへの準拠を明示的に宣言します。 これにより、異なる要件で親プロトコルに暗黙的に 2 回準拠することが回避されます。
The following example explicitly declares the conditional conformance of Array
to Loggable
to avoid a conflict when declaring its conditional conformance to both TitledLoggable
and the new MarkedLoggable
protocol.
次の例では、TitledLoggable
と新しい MarkedLoggable
プロトコルの両方に対する条件付き準拠を宣言する際の競合を回避するために、Loggable
に対する Array
の条件付き準拠を明示的に宣言しています。
protocol MarkedLoggable: Loggable {
func markAndLog()
}
extension MarkedLoggable {
func markAndLog() {
print("----------")
log()
}
}
extension Array: Loggable where Element: Loggable { }
extension Array: TitledLoggable where Element: TitledLoggable {
static var logTitle: String {
return "Array of '\(Element.logTitle)'"
}
}
extension Array: MarkedLoggable where Element: MarkedLoggable { }
Without the extension to explicitly declare conditional conformance to Loggable
, the other Array
extensions would implicitly create these declarations, resulting in an error:
Loggable
への条件適合を明示的に宣言する拡張機能がないと、他の Array
拡張機能がこれらの宣言を暗黙的に作成し、エラーが発生します。
extension Array: Loggable where Element: TitledLoggable { }
extension Array: Loggable where Element: MarkedLoggable { }
// Error: redundant conformance of 'Array<Element>' to protocol 'Loggable'
Grammar of an extension declaration
extension-declaration → attributes? access-level-modifier? extension
type-identifier type-inheritance-clause? generic-where-clause? extension-body
extension-body → {
extension-members? }
extension-members → extension-member extension-members?
extension-member → declaration | compiler-control-statement
Subscript Declaration
添え字の宣言
A subscript declaration allows you to add subscripting support for objects of a particular type and are typically used to provide a convenient syntax for accessing the elements in a collection, list, or sequence. Subscript declarations are declared using the subscript
keyword and have the following form:
添字宣言を使用すると、特定の型のオブジェクトに対する添字サポートを追加できます。これは通常、コレクション、リスト、またはシーケンス内の要素にアクセスするための便利な構文を提供するために使用されます。 添字の宣言は、subscript
キーワードを使用して宣言され、次の形式になります。
subscript (<#parameters#>) -> <#return type#> {
get {
<#statements#>
}
set(<#setter name#>) {
<#statements#>
}
}
Subscript declarations can appear only in the context of a class, structure, enumeration, extension, or protocol declaration.
添字宣言は、クラス、構造体、列挙型、拡張子、またはプロトコル宣言のコンテキスト内でのみ使用できます。
The parameters specify one or more indexes used to access elements of the corresponding type in a subscript expression (for example, the i
in the expression object[i]
). Although the indexes used to access the elements can be of any type, each parameter must include a type annotation to specify the type of each index. The return type specifies the type of the element being accessed.
パラメータは、添字式内の対応する型の要素にアクセスするために使用される 1 つ以上のインデックスを指定します(たとえば、式object[i]
の i
)。 要素へのアクセスに使用されるインデックスは任意の型にすることができますが、各パラメーターには、各インデックスの型を指定する型注釈が含まれている必要があります。 戻り値の型は、アクセスされる要素の型を指定します。
As with computed properties, subscript declarations support reading and writing the value of the accessed elements. The getter is used to read the value, and the setter is used to write the value. The setter clause is optional, and when only a getter is needed, you can omit both clauses and simply return the requested value directly. That said, if you provide a setter clause, you must also provide a getter clause.
計算されたプロパティと同様に、添字宣言は、アクセスされた要素の値の読み取りと書き込みをサポートします。 ゲッターは値の読み取りに使用され、セッターは値の書き込みに使用されます。 セッター 句はオプションであり、ゲッター のみが必要な場合は、両方の句を省略して、要求された値を直接返すことができます。 ただし、セッター 句を指定する場合は、ゲッター句も指定する必要があります。
The setter name and enclosing parentheses are optional. If you provide a setter name, it’s used as the name of the parameter to the setter. If you don’t provide a setter name, the default parameter name to the setter is value
. The type of the parameter to the setter is the same as the return type.
セッター名と括弧はオプションです。 セッター名を指定すると、それがセッターへのパラメーターの名前として使用されます。 セッター名を指定しない場合、セッターのデフォルトのパラメータ名は value
です。 セッターへのパラメータの型は戻り値の型と同じです。
You can overload a subscript declaration in the type in which it’s declared, as long as the parameters or the return type differ from the one you’re overloading. You can also override a subscript declaration inherited from a superclass. When you do so, you must mark the overridden subscript declaration with the override
declaration modifier.
パラメータまたは戻り値の型がオーバーロードするものと異なる限り、宣言された型で添字宣言をオーバーロードできます。 スーパークラスから継承した添字宣言をオーバーライドすることもできます。 その場合、オーバーライドされた添字宣言をoverride
宣言修飾子でマークする必要があります。
Subscript parameters follow the same rules as function parameters, with two exceptions. By default, the parameters used in subscripting don’t have argument labels, unlike functions, methods, and initializers. However, you can provide explicit argument labels using the same syntax that functions, methods, and initializers use. In addition, subscripts can’t have in-out parameters. A subscript parameter can have a default value, using the syntax described in Special Kinds of Parameters.
添字パラメーターは、2 つの例外を除き、関数パラメーターと同じ規則に従います。 デフォルトでは、関数、メソッド、イニシャライザとは異なり、添え字付けで使用されるパラメータには引数ラベルがありません。 ただし、関数、メソッド、初期化子が使用するのと同じ構文を使用して、明示的な引数ラベルを指定できます。 さらに、添字には in-out パラメーターを含めることはできません。 添字パラメータには、「特別な種類のパラメータ」で説明されている構文を使用して、デフォルト値を設定できます。
You can also declare subscripts in the context of a protocol declaration, as described in Protocol Subscript Declaration.
「プロトコルの添字宣言」で説明されているように、プロトコル宣言のコンテキストで添字を宣言することもできます。
For more information about subscripting and to see examples of subscript declarations, see Subscripts.
添え字の詳細と添え字宣言の例については、「添字」を参照してください。
Type Subscript Declarations
型の添字宣言
To declare a subscript that’s exposed by the type, rather than by instances of the type, mark the subscript declaration with the static
declaration modifier. Classes can mark type computed properties with the class
declaration modifier instead to allow subclasses to override the superclass’s implementation. In a class declaration, the static
keyword has the same effect as marking the declaration with both the class
and final
declaration modifiers.
型のインスタンスではなく、型によって公開される添字を宣言するには、添字宣言をstatic
宣言修飾子でマークします。 クラスは、代わりにclass
宣言修飾子を使用して型計算プロパティをマークし、サブクラスがスーパークラスの実装をオーバーライドできるようにすることができます。 クラス宣言では、static
キーワードは、class
宣言修飾子とfinal
宣言修飾子の両方で宣言をマークするのと同じ効果があります。
Grammar of a subscript declaration
subscript-declaration → subscript-head subscript-result generic-where-clause? code-block
subscript-declaration → subscript-head subscript-result generic-where-clause? getter-setter-block
subscript-declaration → subscript-head subscript-result generic-where-clause? getter-setter-keyword-block
subscript-head → attributes? declaration-modifiers? subscript
generic-parameter-clause? parameter-clause
subscript-result → ->
attributes? type
Macro Declaration
マクロ宣言
A macro declaration introduces a new macro. It begins with the macro
keyword and has the following form:
マクロ宣言は新しいマクロを導入します。 これはmacro
キーワードで始まり、次の形式になります。
macro <#name#> = <#macro implementation#>
The macro implementation is another macro, and indicates the location of the code that performs this macro’s expansion. The code that performs macro expansion is a separate Swift program, that uses the SwiftSyntax(Link:github.com) module to interact with Swift code. Call the externalMacro(module:type:)
macro from the Swift standard library, passing in the name of a type that contains the macro’s implementation, and the name of the module that contains that type.
マクロ実装は別のマクロであり、このマクロの展開を実行するコードの場所を示します。 マクロ展開を実行するコードは別個の Swift プログラムであり、SwiftSyntax(Link:github.com)(英語) モジュールを使用して Swift コードと対話します。 Swift 標準ライブラリから externalMacro(module:type:)
マクロを呼び出し、マクロの実装を含む型の名前と、その型を含むモジュールの名前を渡します。
Macros can be overloaded, following the same model used by functions. A macro declaration appears only at file scope.
マクロは、関数で使用されるのと同じモデルに従ってオーバーロードできます。 マクロ宣言はファイル スコープでのみ表示されます。
For an overview of macros in Swift, see Macros.
Swift のマクロの概要については、「マクロ」を参照してください。
Grammar of a macro declaration
macro-declaration → macro-head identifier generic-parameter-clause? macro-signature macro-definition? generic-where-clause
macro-head → attributes? declaration-modifiers? macro
macro-signature → parameter-clause macro-function-signature-result?
macro-function-signature-result → ->
type
macro-definition → =
expression
Operator Declaration
演算子の宣言
An operator declaration introduces a new infix, prefix, or postfix operator into your program and is declared using the operator
keyword.
演算子宣言は、新しい中置演算子、接頭辞、または後置演算子をプログラムに導入し、operator
キーワードを使用して宣言します。
You can declare operators of three different fixities: infix, prefix, and postfix. The fixity of an operator specifies the relative position of an operator to its operands.
3 つの異なる固定 (中間置、前置、後置) の演算子を宣言できます。 演算子の固定性は、演算子のオペランドに対する相対的な位置を指定します。
There are three basic forms of an operator declaration, one for each fixity. The fixity of the operator is specified by marking the operator declaration with the infix
, prefix
, or postfix
declaration modifier before the operator
keyword. In each form, the name of the operator can contain only the operator characters defined in Operators.
演算子宣言には 3 つの基本形式があり、それぞれの固定性に 1 つずつ対応します。 演算子の固定性は、演算子キーワードの前にinfix
、prefix
、またはpostfix
の宣言修飾子を使用してoperator
宣言をマークすることで指定されます。 各フォームでは、演算子の名前には、「演算子」で定義された演算子文字のみを含めることができます。
The following form declares a new infix operator:
次の形式は、新しい中置演算子を宣言します。
infix operator <#operator name#>: <#precedence group#>
An infix operator is a binary operator that’s written between its two operands, such as the familiar addition operator (+
) in the expression 1 + 2
.
中置演算子は、式 1 + 2
のよく知られた加算演算子 (+
) など、2 つのオペランドの間に記述される二項演算子です。
Infix operators can optionally specify a precedence group. If you omit the precedence group for an operator, Swift uses the default precedence group, DefaultPrecedence
, which specifies a precedence just higher than TernaryPrecedence
. For more information, see Precedence Group Declaration.
中置演算子はオプションで優先順位グループを指定できます。 演算子の優先順位グループを省略した場合、Swift はデフォルトの優先順位グループ DefaultPrecedence
を使用します。これは、TernaryPrecedence
よりもわずかに高い優先順位を指定します。 詳細については、「優先グループ宣言」を参照してください。
The following form declares a new prefix operator:
次の形式は、新しい前置演算子を宣言します。
prefix operator <#operator name#>
A prefix operator is a unary operator that’s written immediately before its operand, such as the prefix logical NOT operator (!
) in the expression !a
.
接頭演算子は、式 !a
の前置論理 NOT 演算子 (!
) など、オペランドの直前に記述される単項演算子です。
Prefix operators declarations don’t specify a precedence level. Prefix operators are nonassociative.
前置演算子の宣言では優先レベルは指定されません。 前置演算子は非結合性です。
The following form declares a new postfix operator:
次の形式は、新しい後置演算子を宣言します。
postfix operator <#operator name#>
A postfix operator is a unary operator that’s written immediately after its operand, such as the postfix forced-unwrap operator (!
) in the expression a!
.
後置演算子は、式 a!
の後置強制アンラップ演算子 (!
) など、オペランドの直後に記述される単項演算子です。
As with prefix operators, postfix operator declarations don’t specify a precedence level. Postfix operators are nonassociative.
前置演算子の場合と同様、後置演算子の宣言では優先レベルを指定しません。 後置演算子は非結合性です。
After declaring a new operator, you implement it by declaring a static method that has the same name as the operator. The static method is a member of one of the types whose values the operator takes as an argument — for example, an operator that multiplies a Double
by an Int
is implemented as a static method on either the Double
or Int
structure. If you’re implementing a prefix or postfix operator, you must also mark that method declaration with the corresponding prefix
or postfix
declaration modifier. To see an example of how to create and implement a new operator, see Custom Operators.
新しい演算子を宣言した後、その演算子と同じ名前の静的メソッドを宣言してそれを実装します。 静的メソッドは、演算子が引数として値を受け取る型の 1 つのメンバーです。たとえば、Double
と Int
を乗算する演算子は、Double
または Int
構造体の静的メソッドとして実装されます。 前置または後置の演算子を実装している場合は、そのメソッド宣言を対応するprefix
またはpostfix
の宣言修飾子でマークする必要もあります。 新しいオペレーターを作成して実装する方法の例については、カスタム 演算子をご覧ください。
Grammar of an operator declaration
operator-declaration → prefix-operator-declaration | postfix-operator-declaration | infix-operator-declaration
prefix-operator-declaration → prefix
operator
operator
postfix-operator-declaration → postfix
operator
operator
infix-operator-declaration → infix
operator
operator infix-operator-group?
infix-operator-group → :
precedence-group-name
Precedence Group Declaration
優先グループ宣言
A precedence group declaration introduces a new grouping for infix operator precedence into your program. The precedence of an operator specifies how tightly the operator binds to its operands, in the absence of grouping parentheses.
優先順位グループ宣言により、中置演算子の優先順位の新しいグループがプログラムに導入されます。 演算子の優先順位は、グループ化括弧がない場合に演算子がその関連項目にどの程度厳密に結びつくかを指定します。
A precedence group declaration has the following form:
優先グループの宣言は次の形式になります。
precedencegroup <#precedence group name#> {
higherThan: <#lower group names#>
lowerThan: <#higher group names#>
associativity: <#associativity#>
assignment: <#assignment#>
}
The lower group names and higher group names lists specify the new precedence group’s relation to existing precedence groups. The lowerThan
precedence group attribute may only be used to refer to precedence groups declared outside of the current module. When two operators compete with each other for their operands, such as in the expression 2 + 3 * 5
, the operator with the higher relative precedence binds more tightly to its operands.
下位のグループ名と上位のグループ名のリストは、新しい優先グループと既存の優先グループの関係を指定します。 lowThan
優先グループ属性は、現在のモジュールの外部で宣言された優先グループを参照するためにのみ使用できます。 式 2 + 3 * 5
のように、2 つの演算子が関連項目について互いに競合する場合、相対的な優先順位が高い演算子がその関連項目とより緊密に結びつけされます。
Note
注釈
Precedence groups related to each other using lower group names and higher group names must fit into a single relational hierarchy, but they don’t have to form a linear hierarchy. This means it’s possible to have precedence groups with undefined relative precedence. Operators from those precedence groups can’t be used next to each other without grouping parentheses.
下位グループ名と上位グループ名を使用して相互に関連する優先グループは、単一のリレーショナル階層に収まる必要がありますが、線形階層を形成する必要はありません。 これは、未定義の相対優先順位を持つ優先グループが存在する可能性があることを意味します。 これらの優先順位グループの演算子は、括弧でグループ化しない限り、並べて使用できません。
Swift defines numerous precedence groups to go along with the operators provided by the Swift standard library. For example, the addition (+
) and subtraction (-
) operators belong to the AdditionPrecedence
group, and the multiplication (*
) and division (/
) operators belong to the MultiplicationPrecedence
group. For a complete list of precedence groups provided by the Swift standard library, see Operator Declarations(Link:developer.apple.com).
Swift は、Swift 標準ライブラリによって提供される演算子に合わせて多数の優先順位グループを定義します。 たとえば、加算 (+
) 演算子と減算 (-
) 演算子は AdditionPrecedence
グループに属し、乗算 (*
) と除算 (/
) 演算子は MultiplicationPrecedence
グループに属します。 Swift 標準ライブラリによって提供される優先順位グループの完全なリストについては、「演算子の宣言(Link:developer.apple.com)(英語)」を参照してください。
The associativity of an operator specifies how a sequence of operators with the same precedence level are grouped together in the absence of grouping parentheses. You specify the associativity of an operator by writing one of the context-sensitive keywords left
, right
, or none
— if your omit the associativity, the default is none
. Operators that are left-associative group left-to-right. For example, the subtraction operator (-
) is left-associative, so the expression 4 - 5 - 6
is grouped as (4 - 5) - 6
and evaluates to -7
. Operators that are right-associative group right-to-left, and operators that are specified with an associativity of none
don’t associate at all. Nonassociative operators of the same precedence level can’t appear adjacent to each to other. For example, the <
operator has an associativity of none
, which means 1 < 2 < 3
isn’t a valid expression.
演算子の結合性は、グループ化括弧がない場合に、同じ優先順位を持つ一連の演算子をどのようにグループ化するかを指定します。 演算子の結合性を指定するには、状況依存のキーワード left
、right
、または none
のいずれかを記述します。結合性を省略した場合、デフォルトは none
になります。 左結合の演算子は、左から右にグループ化されます。 たとえば、減算演算子 (-
) は左結合であるため、式 4 - 5 - 6
は (4 - 5) - 6
としてグループ化され、-7
と評価されます。 右結合の演算子は右から左にグループ化され、none
結合で指定された演算子はまったく関連付けられません。 同じ優先レベルの非結合演算子を互いに隣接して表示することはできません。 たとえば、<
演算子の結合性はnone
です。これは、1 < 2 < 3
が有効な式ではないことを意味します。
The assignment of a precedence group specifies the precedence of an operator when used in an operation that includes optional chaining. When set to true
, an operator in the corresponding precedence group uses the same grouping rules during optional chaining as the assignment operators from the Swift standard library. Otherwise, when set to false
or omitted, operators in the precedence group follows the same optional chaining rules as operators that don’t perform assignment.
優先順位グループの割り当てにより、オプションの連鎖を含む操作で使用される演算子の優先順位が指定されます。 true
に設定すると、対応する優先グループの演算子は、オプションのチェーン中に、Swift 標準ライブラリの代入演算子と同じグループ化ルールを使用します。 それ以外の場合、 false
に設定するか省略すると、優先順位グループの演算子は、代入を実行しない演算子と同じオプションの連鎖ルールに従います。
Grammar of a precedence group declaration
precedence-group-declaration → precedencegroup
precedence-group-name {
precedence-group-attributes? }
precedence-group-attributes → precedence-group-attribute precedence-group-attributes?
precedence-group-attribute → precedence-group-relation
precedence-group-attribute → precedence-group-assignment
precedence-group-attribute → precedence-group-associativity
precedence-group-relation → higher
:
precedence-group-names
precedence-group-relation → lower
:
precedence-group-names
precedence-group-assignment → assignment
:
boolean-literal
precedence-group-associativity → associativity
:
left
precedence-group-associativity → associativity
:
right
precedence-group-associativity → associativity
:
none
precedence-group-names → precedence-group-name | precedence-group-name ,
precedence-group-names
precedence-group-name → identifier
Declaration Modifiers
宣言修飾子
Declaration modifiers are keywords or context-sensitive keywords that modify the behavior or meaning of a declaration. You specify a declaration modifier by writing the appropriate keyword or context-sensitive keyword between a declaration’s attributes (if any) and the keyword that introduces the declaration.
宣言修飾子は、宣言の動作や意味を変更するキーワードまたは状況依存のキーワードです。 宣言修飾子を指定するには、宣言の属性 (存在する場合) と宣言を導入するキーワードの間に、適切なキーワードまたはコンテキスト依存キーワードを記述します。
class
Apply this modifier to a member of a class to indicate that the member is a member of the class itself, rather than a member of instances of the class. Members of a superclass that have this modifier and don’t have the final
modifier can be overridden by subclasses.
この修飾子をクラスのメンバーに適用して、そのメンバーがクラスのインスタンスのメンバーではなく、クラス自体のメンバーであることを示します。 この修飾子を持ち、final 修飾子を持たないスーパークラスのメンバーは、サブクラス によってオーバーライドできます。
dynamic
Apply this modifier to any member of a class that can be represented by Objective-C. When you mark a member declaration with the dynamic
modifier, access to that member is always dynamically dispatched using the Objective-C runtime. Access to that member is never inlined or devirtualized by the compiler.
この修飾子を、Objective-C で表現できるクラスの任意のメンバーに適用します。 メンバー宣言をdynamic
修飾子でマークすると、そのメンバーへのアクセスは常に Objective-C ランタイムを使用して動的にディスパッチされます。 そのメンバーへのアクセスは、コンパイラーによってインライン化または非仮想化されることはありません。
Because declarations marked with the dynamic
modifier are dispatched using the Objective-C runtime, they must be marked with the objc
attribute.
dynamic
修飾子でマークされた宣言は Objective-C ランタイムを使用してディスパッチされるため、objc
属性でマークする必要があります。
final
Apply this modifier to a class or to a property, method, or subscript member of a class. It’s applied to a class to indicate that the class can’t be subclassed. It’s applied to a property, method, or subscript of a class to indicate that a class member can’t be overridden in any subclass. For an example of how to use the final
attribute, see Preventing Overrides.
この修飾子をクラス、またはクラスのプロパティ、メソッド、または添字メンバーに適用します。 これは、クラスをサブクラス化できないことを示すためにクラスに適用されます。 これは、クラスのプロパティ、メソッド、または添え字に適用され、クラス メンバーがどのサブクラスでもオーバーライドできないことを示します。 final
属性の使用方法の例については、オーバーライドの防止を参照してください。
lazy
Apply this modifier to a stored variable property of a class or structure to indicate that the property’s initial value is calculated and stored at most once, when the property is first accessed. For an example of how to use the lazy
modifier, see Lazy Stored Properties.
この修飾子をクラスまたは構造体の格納された変数プロパティに適用して、プロパティの初期値が、プロパティに最初にアクセスしたときに最大 1 回だけ計算および格納されることを示します。 lazy
修飾子の使用方法の例については、遅延保存プロパティを参照してください。
optional
Apply this modifier to a protocol’s property, method, or subscript members to indicate that a conforming type isn’t required to implement those members.
この修飾子をプロトコルのプロパティ、メソッド、または添字メンバーに適用して、これらのメンバーを実装するために準拠する型が必要ないことを示します。
You can apply the optional
modifier only to protocols that are marked with the objc
attribute. As a result, only class types can adopt and conform to a protocol that contains optional member requirements. For more information about how to use the optional
modifier and for guidance about how to access optional protocol members — for example, when you’re not sure whether a conforming type implements them — see Optional Protocol Requirements.
optional
修飾子は、objc
属性でマークされたプロトコルにのみ適用できます。 その結果、クラス型のみが、オプションのメンバー要件を含むプロトコルを採用し、準拠することができます。 optional
修飾子の使用方法の詳細と、オプションのプロトコル メンバーにアクセスする方法に関するガイダンス(たとえば、適合する型がそれらを実装しているかどうかわからない場合)については、オプションのプロトコル要件を参照してください。
required
Apply this modifier to a designated or convenience initializer of a class to indicate that every subclass must implement that initializer. The subclass’s implementation of that initializer must also be marked with the required
modifier.
この修飾子をクラスの指定されたイニシャライザまたはコンビニエンス イニシャライザに適用して、すべてのサブクラスがそのイニシャライザを実装する必要があることを示します。 そのイニシャライザのサブクラスの実装も、required
修飾子でマークする必要があります。
static
Apply this modifier to a member of a structure, class, enumeration, or protocol to indicate that the member is a member of the type, rather than a member of instances of that type. In the scope of a class declaration, writing the static
modifier on a member declaration has the same effect as writing the class
and final
modifiers on that member declaration. However, constant type properties of a class are an exception: static
has its normal, nonclass meaning there because you can’t write class
or final
on those declarations.
この修飾子を構造体、クラス、列挙、またはプロトコルのメンバーに適用して、メンバーがその型のインスタンスのメンバーではなく、その型のメンバーであることを示します。 クラス宣言のスコープ内で、メンバー宣言に static
修飾子を記述することは、そのメンバー宣言に class
修飾子とfinal
修飾子を記述することと同じ効果があります。 ただし、クラスの定数型プロパティは例外です。static
には通常、非クラスの意味があります。これは、これらの宣言にclass
やfinal
を書くことができないためです。
unowned
Apply this modifier to a stored variable, constant, or stored property to indicate that the variable or property has an unowned reference to the object stored as its value. If you try to access the variable or property after the object has been deallocated, a runtime error is raised. Like a weak reference, the type of the property or value must be a class type; unlike a weak reference, the type is non-optional. For an example and more information about the unowned
modifier, see Unowned References.
この修飾子を格納された変数、定数、または格納されたプロパティに適用すると、その変数またはプロパティが値として格納されたオブジェクトへの所有されていない参照を持つことを示します。 オブジェクトの割り当てが解除された後に変数またはプロパティにアクセスしようとすると、実行時エラーが発生します。 弱参照と同様、プロパティまたは値の型はクラス型である必要があります。 弱参照とは異なり、型はオプションではありません。 unowned
修飾子の例と詳細については、非所有参照を参照してください。
unowned(safe)
An explicit spelling of unowned
.
unowned
の明示的なスペル
unowned(unsafe)
Apply this modifier to a stored variable, constant, or stored property to indicate that the variable or property has an unowned reference to the object stored as its value. If you try to access the variable or property after the object has been deallocated, you’ll access the memory at the location where the object used to be, which is a memory-unsafe operation. Like a weak reference, the type of the property or value must be a class type; unlike a weak reference, the type is non-optional. For an example and more information about the unowned
modifier, see Unowned References.weak
この修飾子を格納された変数、定数、または格納されたプロパティに適用すると、その変数またはプロパティが値として格納されたオブジェクトへの所有されていない参照を持つことを示します。 オブジェクトの割り当てが解除された後に変数またはプロパティにアクセスしようとすると、オブジェクトが以前存在していた場所にあるメモリにアクセスすることになり、メモリにとって安全ではない操作になります。 弱参照と同様、プロパティまたは値の型はクラス型である必要があります。 弱参照とは異なり、型はオプションではありません。 unowned
修飾子の例と詳細については、非所有参照を参照してください。
weak
Apply this modifier to a stored variable or stored variable property to indicate that the variable or property has a weak reference to the object stored as its value. The type of the variable or property must be an optional class type. If you access the variable or property after the object has been deallocated, its value is nil
. For an example and more information about the weak
modifier, see Weak References.
この修飾子を格納変数または格納変数プロパティに適用して、変数またはプロパティが値として格納されているオブジェクトへの弱参照を持つことを示します。 変数またはプロパティの型は、オプションのクラス型である必要があります。 オブジェクトの割り当てが解除された後に変数またはプロパティにアクセスすると、その値は nil
になります。 weak
修飾子の例と詳細については、「弱参照」を参照してください。
Access Control Levels
アクセス制御レベル
Swift provides five levels of access control: open, public, internal, file private, and private. You can mark a declaration with one of the access-level modifiers below to specify the declaration’s access level. Access control is discussed in detail in Access Control.
Swift は、オープン、パブリック、内部、ファイルプライベート、およびプライベートの 5 つのレベルのアクセス制御を提供します。 以下のアクセス レベル修飾子のいずれかを使用して宣言をマークして、宣言のアクセス レベルを指定できます。 アクセス制御については、アクセス制御 で詳しく説明されています。
open
Apply this modifier to a declaration to indicate the declaration can be accessed and subclassed by code in the same module as the declaration. Declarations marked with the open
access-level modifier can also be accessed and subclassed by code in a module that imports the module that contains that declaration.
この修飾子を宣言に適用すると、宣言と同じモジュール内のコードによって宣言にアクセスでき、サブクラス化できることを示します。 open
アクセスレベル修飾子でマークされた宣言は、その宣言を含むモジュールをインポートするモジュール内のコードによってアクセスおよびサブクラス化することもできます。
public
Apply this modifier to a declaration to indicate the declaration can be accessed and subclassed by code in the same module as the declaration. Declarations marked with the public
access-level modifier can also be accessed (but not subclassed) by code in a module that imports the module that contains that declaration.
この修飾子を宣言に適用すると、宣言と同じモジュール内のコードによって宣言にアクセスでき、サブクラス化できることを示します。 public
アクセスレベル修飾子でマークされた宣言には、その宣言を含むモジュールをインポートするモジュール内のコードからもアクセスできます(ただし、サブクラス化はできません)。
internal
Apply this modifier to a declaration to indicate the declaration can be accessed only by code in the same module as the declaration. By default, most declarations are implicitly marked with the internal
access-level modifier.
この修飾子を宣言に適用して、宣言と同じモジュール内のコードからのみ宣言にアクセスできることを示します。 デフォルトでは、ほとんどの宣言はinternal
アクセスレベル修飾子 で暗黙的にマークされます。
fileprivate
Apply this modifier to a declaration to indicate the declaration can be accessed only by code in the same source file as the declaration.
この修飾子を宣言に適用すると、その宣言には、宣言と同じソース ファイル内のコードからのみアクセスできるようになります。
private
Apply this modifier to a declaration to indicate the declaration can be accessed only by code within the declaration’s immediate enclosing scope.
この修飾子を宣言に適用すると、宣言を直接囲んでいるスコープ内のコードによってのみ宣言にアクセスできることを示します。
For the purpose of access control, extensions to the same type that are in the same file share an access-control scope. If the type they extend is also in the same file, they share the type’s access-control scope. Private members declared in the type’s declaration can be accessed from extensions, and private members declared in one extension can be accessed from other extensions and from the type’s declaration.
アクセス制御の目的で、同じファイル内にある同じ型の拡張機能はアクセス制御スコープを共有します。 拡張する型も同じファイル内にある場合、その型のアクセス制御スコープを共有します。 型の宣言で宣言されたプライベート メンバーには拡張機能からアクセスでき、1 つの拡張機能で宣言されたプライベート メンバーには他の拡張機能や型の宣言からアクセスできます。
Each access-level modifier above optionally accepts a single argument, which consists of the set
keyword enclosed in parentheses (for example, private(set)
). Use this form of an access-level modifier when you want to specify an access level for the setter of a variable or subscript that’s less than or equal to the access level of the variable or subscript itself, as discussed in Getters and Setters.
上記の各アクセスレベル修飾子は、必要に応じて、かっこで囲まれた set
キーワードで構成される単一の引数を受け入れます(例: private(set)
)。 「ゲッターとセッター」で説明したように、変数または添字自体のアクセス レベル以下のアクセス レベルを変数または添字のセッターに指定する場合は、この形式のアクセス レベル修飾子を使用します。
Grammar of a declaration modifier
declaration-modifier → class
| convenience
| dynamic
| final
| infix
| lazy
| optional
| override
| postfix
| prefix
| required
| static
| unowned
| unowned
(
safe
)
| unowned
(
unsafe
)
| weak
declaration-modifier → access-level-modifier
declaration-modifier → mutation-modifier
declaration-modifier → actor-isolation-modifier
declaration-modifiers → declaration-modifier declaration-modifiers?
access-level-modifier → private
| private
(
set
)
access-level-modifier → fileprivate
| fileprivate
(
set
)
access-level-modifier → internal
| internal
(
set
)
access-level-modifier → public
| public
(
set
)
access-level-modifier → open
| open
(
set
)
mutation-modifier → mutating
| nonmutating
actor-isolation-modifier → nonisolated