型
日本語を消す 英語を消す下記URLから引用し、日本語訳をつけてみました
https://docs.swift.org/swift-book/documentation/the-swift-programming-language/types
Use built-in named and compound types.
組み込みの名前付き型と複合型を使用します。
In Swift, there are two kinds of types: named types and compound types. A named type is a type that can be given a particular name when it’s defined. Named types include classes, structures, enumerations, and protocols. For example, instances of a user-defined class named MyClass
have the type MyClass
. In addition to user-defined named types, the Swift standard library defines many commonly used named types, including those that represent arrays, dictionaries, and optional values.
Swift には、名前付きタイプと複合タイプの 2 種類のタイプがあります。 名前付きタイプは、定義時に特定の名前を付けることができるタイプです。 名前付き型には、クラス、構造体、列挙型、およびプロトコルが含まれます。 たとえば、「MyClass
」という名前のユーザー定義クラスのインスタンスのタイプは「MyClass
」です。 ユーザー定義の名前付き型に加えて、Swift 標準ライブラリでは、配列、辞書、オプションの値を表すものなど、一般的に使用される多くの名前付き型が定義されています。
Data types that are normally considered basic or primitive in other languages — such as types that represent numbers, characters, and strings — are actually named types, defined and implemented in the Swift standard library using structures. Because they’re named types, you can extend their behavior to suit the needs of your program, using an extension declaration, discussed in Extensions and Extension Declaration.
数値、文字、文字列を表す型など、他の言語では通常基本またはプリミティブとみなされているデータ型は、実際には名前付き型であり、構造体を使用して Swift 標準ライブラリで定義および実装されています。 これらは名前付きタイプであるため、「拡張機能」と「拡張機能の宣言」で説明されている拡張宣言を使用して、プログラムのニーズに合わせて動作を拡張できます。
A compound type is a type without a name, defined in the Swift language itself. There are two compound types: function types and tuple types. A compound type may contain named types and other compound types. For example, the tuple type (Int, (Int, Int))
contains two elements: The first is the named type Int
, and the second is another compound type (Int, Int)
.
複合型は、Swift 言語自体で定義された名前のない型です。 複合タイプには、関数タイプとタプルタイプの 2 つがあります。 複合タイプには、名前付きタイプと他の複合タイプが含まれる場合があります。 たとえば、タプル型 (Int, (Int, Int))
には 2 つの要素が含まれています。1 つ目は名前付き型 Int
で、2 つ目は別の複合型 (Int, Int)
です。
You can put parentheses around a named type or a compound type. However, adding parentheses around a type doesn’t have any effect. For example, (Int)
is equivalent to Int
.
名前付き型または複合型を括弧で囲むことができます。 ただし、型の周囲にかっこを追加しても効果はありません。 たとえば、(Int)
は Int
と同等です。
This chapter discusses the types defined in the Swift language itself and describes the type inference behavior of Swift.
この章では、Swift 言語自体で定義されている型について説明し、Swift の型推論の動作について説明します。
Grammar of a type
type → function-type
type → array-type
type → dictionary-type
type → type-identifier
type → tuple-type
type → optional-type
type → implicitly-unwrapped-optional-type
type → protocol-composition-type
type → opaque-type
type → boxed-protocol-type
type → metatype-type
type → any-type
type → self-type
type → (
type )
Type Annotation
型の注釈
A type annotation explicitly specifies the type of a variable or expression. Type annotations begin with a colon (:
) and end with a type, as the following examples show:
型アノテーションは、変数または式の型を明示的に指定します。 次の例に示すように、型アノテーションはコロン (:
) で始まり、型で終わります。
let someTuple: (Double, Double) = (3.14159, 2.71828)
func someFunction(a: Int) { /* ... */ }
In the first example, the expression someTuple
is specified to have the tuple type (Double, Double)
. In the second example, the parameter a
to the function someFunction
is specified to have the type Int
.
最初の例では、式 someTuple
がタプル タイプ (Double, Double)
を持つように指定されています。 2 番目の例では、関数 someFunction
のパラメータ a
が Int
型を持つように指定されています。
Type annotations can contain an optional list of type attributes before the type.
型アノテーションには、型の前にオプションの型属性のリストを含めることができます。
Grammar of a type annotation
type-annotation → :
attributes? type
Type Identifier
タイプ識別子
A type identifier refers to either a named type or a type alias of a named or compound type.
タイプ識別子は、名前付きタイプ、または名前付きタイプまたは複合タイプのタイプ エイリアスのいずれかを指します。
Most of the time, a type identifier directly refers to a named type with the same name as the identifier. For example, Int
is a type identifier that directly refers to the named type Int
, and the type identifier Dictionary<String, Int>
directly refers to the named type Dictionary<String, Int>
.
ほとんどの場合、型識別子は、識別子と同じ名前を持つ名前付き型を直接参照します。 たとえば、Int
は名前付き型 Int
を直接参照する型識別子であり、型識別子Dictionary<String, Int>
は名前付き型 Dictionary<String, Int>
を直接参照します。
There are two cases in which a type identifier doesn’t refer to a type with the same name. In the first case, a type identifier refers to a type alias of a named or compound type. For instance, in the example below, the use of Point
in the type annotation refers to the tuple type (Int, Int)
.
型識別子が同じ名前の型を参照しない場合が 2 つあります。 最初のケースでは、型識別子は名前付き型または複合型の型別名を参照します。 たとえば、以下の例では、型アノテーションでの Point
の使用は、タプル型 (Int, Int)
を参照しています。
typealias Point = (Int, Int)
let origin: Point = (0, 0)
In the second case, a type identifier uses dot (.
) syntax to refer to named types declared in other modules or nested within other types. For example, the type identifier in the following code references the named type MyType
that’s declared in the ExampleModule
module.
2 番目のケースでは、型識別子はドット (.
) 構文を使用して、他のモジュールで宣言された、または他の型内にネストされた名前付き型を参照します。 たとえば、次のコードの型識別子は、ExampleModule
モジュールで宣言されている名前付き型 MyType
を参照します。
var someValue: ExampleModule.MyType
Grammar of a type identifier
type-identifier → type-name generic-argument-clause? | type-name generic-argument-clause? .
type-identifier
type-name → identifier
Tuple Type
タプルの型
A tuple type is a comma-separated list of types, enclosed in parentheses.
タプル 型は、かっこで囲まれた型のカンマ区切りのリストです。
You can use a tuple type as the return type of a function to enable the function to return a single tuple containing multiple values. You can also name the elements of a tuple type and use those names to refer to the values of the individual elements. An element name consists of an identifier followed immediately by a colon (:). For an example that demonstrates both of these features, see Functions with Multiple Return Values.
タプル型を関数の戻り値の型として使用すると、関数が複数の値を含む単一のタプルを返すことができます。 タプル型の要素に名前を付け、それらの名前を使用して個々の要素の値を参照することもできます。 要素名は、識別子の直後にコロン (:
) が続いたもので構成されます。 これらの機能の両方を示す例については、「複数の戻り値を持つ関数」を参照してください。
When an element of a tuple type has a name, that name is part of the type.
タプル型の要素に名前がある場合、その名前は型の一部です。
var someTuple = (top: 10, bottom: 12) // someTuple is of type (top: Int, bottom: Int)
someTuple = (top: 4, bottom: 42) // OK: names match
someTuple = (9, 99) // OK: names are inferred
someTuple = (left: 5, right: 5) // Error: names don't match
All tuple types contain two or more types, except for Void
which is a type alias for the empty tuple type, ()
.
空のタプル型 ()
の型エイリアスである Void
を除く、すべてのタプル型には 2 つ以上の型が含まれます。
Grammar of a tuple type
tuple-type → (
)
| (
tuple-type-element ,
tuple-type-element-list )
tuple-type-element-list → tuple-type-element | tuple-type-element ,
tuple-type-element-list
tuple-type-element → element-name type-annotation | type
element-name → identifier
Function Type
関数型
A function type represents the type of a function, method, or closure and consists of a parameter and return type separated by an arrow (->
):
関数型は関数、メソッド、クロージャの型を表し、矢印(->
)で区切られたパラメータと戻り値の型で構成されます。
(<#parameter type#>) -> <#return type#>
The parameter type is comma-separated list of types. Because the return type can be a tuple type, function types support functions and methods that return multiple values.
パラメータの型は、型のカンマ区切りのリストです。 戻り値の型はタプル型になる可能性があるため、関数型は複数の値を返す関数とメソッドをサポートします。
A parameter of the function type () -> T
(where T
is any type) can apply the autoclosure
attribute to implicitly create a closure at its call sites. This provides a syntactically convenient way to defer the evaluation of an expression without needing to write an explicit closure when you call the function. For an example of an autoclosure function type parameter, see Autoclosures.
関数型 () -> T
(T
は任意の型) のパラメータは、autoclosure
属性を適用して、呼び出し側で暗黙的にクロージャを作成できます。 これにより、関数を呼び出すときに明示的なクロージャを記述する必要がなく、式の評価を延期する構文的に便利な方法が提供されます。 オートクロージャ関数型のパラメータの例については、「オートクロージャ」を参照してください。
A function type can have variadic parameters in its parameter type. Syntactically, a variadic parameter consists of a base type name followed immediately by three dots (...
), as in Int...
. A variadic parameter is treated as an array that contains elements of the base type name. For instance, the variadic parameter Int...
is treated as [Int]
. For an example that uses a variadic parameter, see Variadic Parameters.
関数タイプのパラメータ タイプには可変個引数パラメータを含めることができます。 構文的には、可変長引数パラメーターは、Int…
のように、基本型名の直後に 3 つのドット (…
) が続いた構成になります。可変長引数パラメーターは、基本型名の要素を含む配列として扱われます。 たとえば、可変個引数パラメーター Int…
は [Int]
として扱われます。 可変個引数パラメーターを使用する例については、「可変個引数パラメーター」を参照してください。
To specify an in-out parameter, prefix the parameter type with the inout
keyword. You can’t mark a variadic parameter or a return type with the inout
keyword. In-out parameters are discussed in In-Out Parameters.
in-out パラメータを指定するには、パラメータ タイプの前に inout キーワードを付けます。 可変長引数パラメータまたは戻り値の型を inout キーワードでマークすることはできません。 In-out パラメータについては、「In-Out パラメータ」で説明します。
If a function type has only one parameter and that parameter’s type is a tuple type, then the tuple type must be parenthesized when writing the function’s type. For example, ((Int, Int)) -> Void
is the type of a function that takes a single parameter of the tuple type (Int, Int)
and doesn’t return any value. In contrast, without parentheses, (Int, Int) -> Void
is the type of a function that takes two Int
parameters and doesn’t return any value. Likewise, because Void
is a type alias for ()
, the function type (Void) -> Void
is the same as (()) -> ()
— a function that takes a single argument that’s an empty tuple. These types aren’t the same as () -> ()
— a function that takes no arguments.
関数型にパラメーターが 1 つだけあり、そのパラメーターの型がタプル型である場合、関数の型を記述するときにタプル型を括弧で囲む必要があります。 たとえば、((Int, Int)) -> Void
は、タプル型 (Int, Int)
の単一パラメータを受け取り、値を返さない関数の型です。 対照的に、括弧なしの (Int, Int) -> Void
は、2 つの Int
パラメーターを受け取り、値を返さない関数のタイプです。 同様に、Void
は ()
の型エイリアスであるため、関数型 (Void) -> Void
は (()) -> ()
と同じであり、空のタプルである単一の引数を取る関数です。 これらの型は、引数を取らない関数である () -> ()
とは異なります。
Argument names in functions and methods aren’t part of the corresponding function type. For example:
関数およびメソッドの引数名は、対応する関数タイプの一部ではありません。 例えば:
func someFunction(left: Int, right: Int) {}
func anotherFunction(left: Int, right: Int) {}
func functionWithDifferentLabels(top: Int, bottom: Int) {}
var f = someFunction // The type of f is (Int, Int) -> Void, not (left: Int, right: Int) -> Void.
f = anotherFunction // OK
f = functionWithDifferentLabels // OK
func functionWithDifferentArgumentTypes(left: Int, right: String) {}
f = functionWithDifferentArgumentTypes // Error
func functionWithDifferentNumberOfArguments(left: Int, right: Int, top: Int) {}
f = functionWithDifferentNumberOfArguments // Error
Because argument labels aren’t part of a function’s type, you omit them when writing a function type.
引数ラベルは関数の型の一部ではないため、関数の型を記述するときは省略します。
var operation: (lhs: Int, rhs: Int) -> Int // Error
var operation: (_ lhs: Int, _ rhs: Int) -> Int // OK
var operation: (Int, Int) -> Int // OK
If a function type includes more than a single arrow (->
), the function types are grouped from right to left. For example, the function type (Int) -> (Int) -> Int
is understood as (Int) -> ((Int) -> Int)
— that is, a function that takes an Int
and returns another function that takes and returns an Int
.
関数タイプに複数の矢印 (->
) が含まれる場合、関数タイプは右から左にグループ化されます。 たとえば、関数タイプ (Int) -> (Int) -> Int
は、(Int) -> ((Int) -> Int)
として理解されます。つまり、Int
を受け取り、Int
を受け取りInt
を返す関数を返す関数です。
Function types for functions that can throw or rethrow an error must be marked with the throws
keyword. 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 the same places as a throwing one. Throwing and rethrowing functions are described in Throwing Functions and Methods and Rethrowing Functions and Methods.
エラーをスローまたは再スローできる関数の関数タイプには、throw
キーワードを付ける必要があります。 throws
キーワードは関数のタイプの一部であり、非スロー関数はスロー関数のサブタイプです。 その結果、非スロー関数をスロー関数と同じ場所で使用できます。 スロー関数と再スロー関数については、スロー関数とメソッドと再スロー関数とメソッドで説明されています。
Function types for asynchronous functions must be marked with the async
keyword. The async
keyword is part of a function’s type, and synchronous functions are subtypes of asynchronous functions. As a result, you can use a synchronous function in the same places as an asynchronous one. For information about asynchronous functions, see Asynchronous Functions and Methods.
非同期関数の関数タイプは、async
キーワードでマークする必要があります。 async
キーワードは関数のタイプの一部であり、同期関数は非同期関数のサブタイプです。 その結果、同期関数を非同期関数と同じ場所で使用できます。 非同期関数の詳細については、「非同期関数とメソッド」を参照してください。
Restrictions for Nonescaping Closures
ノンエスケープクロージャーの制限事項
A parameter that’s a nonescaping function can’t be stored in a property, variable, or constant of type Any
, because that might allow the value to escape.
ノンエスケープ関数のパラメータは、値がエスケープされる可能性があるため、Any
型のプロパティ、変数、または定数に格納できません。
A parameter that’s a nonescaping function can’t be passed as an argument to another nonescaping function parameter. This restriction helps Swift perform more of its checks for conflicting access to memory at compile time instead of at runtime. For example:
ノンエスケープ関数のパラメーターを、別のノンエスケープ関数パラメーターに引数として渡すことはできません。 この制限により、Swift は実行時ではなくコンパイル時にメモリへの競合アクセスのチェックをより多く実行することができます。 例えば:
let external: (() -> Void) -> Void = { _ in () }
func takesTwoFunctions(first: (() -> Void) -> Void, second: (() -> Void) -> Void) {
first { first {} } // Error
second { second {} } // Error
first { second {} } // Error
second { first {} } // Error
first { external {} } // OK
external { first {} } // OK
}
In the code above, both of the parameters to takesTwoFunctions(first:second:)
are functions. Neither parameter is marked @escaping
, so they’re both nonescaping as a result.
上記のコードでは、takesTwoFunctions(first:second:)
のパラメータは両方とも関数です。 どちらのパラメータも @escaping
とマークされていないため、結果として両方とも非エスケープになります。
The four function calls marked “Error” in the example above cause compiler errors. Because the first
and second
parameters are nonescaping functions, they can’t be passed as arguments to another nonescaping function parameter. In contrast, the two function calls marked “OK” don’t cause a compiler error. These function calls don’t violate the restriction because external
isn’t one of the parameters of takesTwoFunctions(first:second:)
.
上記の例で「エラー」とマークされている 4 つの関数呼び出しは、コンパイラ エラーを引き起こします。 first
のパラメータと second
のパラメータはノンエスケープ関数であるため、別のノンエスケープ関数パラメータに引数として渡すことはできません。 対照的に、「OK」とマークされた 2 つの関数呼び出しはコンパイラ エラーを引き起こしません。 external
は takesTwoFunctions(first:second:)
のパラメータの 1 つではないため、これらの関数呼び出しは制限に違反しません。
If you need to avoid this restriction, mark one of the parameters as escaping, or temporarily convert one of the nonescaping function parameters to an escaping function by using the withoutActuallyEscaping(_:do:)
function. For information about avoiding conflicting access to memory, see Memory Safety.
この制限を回避する必要がある場合は、パラメータの 1 つをエスケープ関数としてマークするか、withoutActuallyEscaping(_:do:)
関数を使用してノンエスケープ関数パラメータの 1 つをエスケープ関数に一時的に変換します。 メモリへのアクセスの競合を回避する方法については、「メモリの安全性」を参照してください。
Grammar of a function type
function-type → attributes? function-type-argument-clause async
? throws
? ->
type
function-type-argument-clause → (
)
function-type-argument-clause → (
function-type-argument-list ...
? )
function-type-argument-list → function-type-argument | function-type-argument ,
function-type-argument-list
function-type-argument → attributes? parameter-modifier? type | argument-label type-annotation
argument-label → identifier
Array Type
配列型
The Swift language provides the following syntactic sugar for the Swift standard library Array<Element>
type:
Swift 言語は、Swift 標準ライブラリの Array<Element>
型に次の糖衣構文を提供します。
[<#type#>]
In other words, the following two declarations are equivalent:
つまり、次の 2 つの宣言は同等です。
let someArray: Array<String> = ["Alex", "Brian", "Dave"]
let someArray: [String] = ["Alex", "Brian", "Dave"]
In both cases, the constant someArray
is declared as an array of strings. The elements of an array can be accessed through subscripting by specifying a valid index value in square brackets: someArray[0]
refers to the element at index 0, "Alex"
.
どちらの場合も、定数 someArray
は文字列の配列として宣言されます。 配列の要素には、角括弧内に有効なインデックス値を指定することで、添字を使用してアクセスできます。someArray[0]
は、インデックス 0
の要素"Alex"
を参照します。
You can create multidimensional arrays by nesting pairs of square brackets, where the name of the base type of the elements is contained in the innermost pair of square brackets. For example, you can create a three-dimensional array of integers using three sets of square brackets:
角括弧のペアをネストすることによって多次元配列を作成できます。要素の基本型の名前は最も内側の角括弧のペアに含まれます。 たとえば、3 セットの大括弧を使用して、整数の 3 次元配列を作成できます。
var array3D: [[[Int]]] = [[[1, 2], [3, 4]], [[5, 6], [7, 8]]]
When accessing the elements in a multidimensional array, the left-most subscript index refers to the element at that index in the outermost array. The next subscript index to the right refers to the element at that index in the array that’s nested one level in. And so on. This means that in the example above, array3D[0]
refers to [[1, 2], [3, 4]]
, array3D[0][1]
refers to [3, 4]
, and array3D[0][1][1]
refers to the value 4.
多次元配列内の要素にアクセスする場合、左端の添え字インデックスは、最も外側の配列内のそのインデックスにある要素を参照します。 右にある次の添字インデックスは、1 レベルにネストされている配列内のそのインデックスにある要素を参照します。以下同様です。 これは、上記の例では、array3D[0]
は [[1, 2], [3, 4]]
を参照し、array3D[0][1]
は [3, 4]
を参照し、array3D[0][1][1]
は値 4
を参照します。
For a detailed discussion of the Swift standard library Array
type, see Arrays.
Swift 標準ライブラリのArray
型の詳細については、「配列」を参照してください。
Grammar of an array type
array-type → [
type ]
Dictionary Type
辞書型
The Swift language provides the following syntactic sugar for the Swift standard library Dictionary<Key, Value>
type:
Swift 言語は、Swift 標準ライブラリの Dictionary<Key, Value>
タイプに次の糖衣構文を提供します。
[<#key type#>: <#value type#>]
In other words, the following two declarations are equivalent:
つまり、次の 2 つの宣言は同等です。
let someDictionary: [String: Int] = ["Alex": 31, "Paul": 39]
let someDictionary: Dictionary<String, Int> = ["Alex": 31, "Paul": 39]
In both cases, the constant someDictionary
is declared as a dictionary with strings as keys and integers as values.
どちらの場合も、定数 someDictionary
は、キーとして文字列、値として整数を持つ辞書として宣言されます。
The values of a dictionary can be accessed through subscripting by specifying the corresponding key in square brackets: someDictionary["Alex"]
refers to the value associated with the key "Alex"
. The subscript returns an optional value of the dictionary’s value type. If the specified key isn’t contained in the dictionary, the subscript returns nil
.
辞書の値には、対応するキーを角かっこで指定することで、添え字を付けてアクセスできます。someDictionary["Alex"]
は、キー "Alex"
に関連付けられた値を指します。 添え字は、ディクショナリの値型のオプションの値を返します。 指定されたキーが辞書に含まれていない場合、添え字は nil
を返します。
The key type of a dictionary must conform to the Swift standard library Hashable
protocol.
辞書のキーのタイプは、Swift 標準ライブラリのHashable
プロトコルに準拠する必要があります。
For a detailed discussion of the Swift standard library Dictionary
type, see Dictionaries.
Swift 標準ライブラリのDictionary
型の詳細については、「辞書」を参照してください。
Grammar of a dictionary type
dictionary-type → [
type :
type ]
Optional Type
オプションの型
The Swift language defines the postfix ?
as syntactic sugar for the named type Optional<Wrapped>
, which is defined in the Swift standard library. In other words, the following two declarations are equivalent:
Swift 言語は後置演算子 ?
を標準ライブラリで定義されている名前付き型 Optional<Wrapped>
の糖衣構文として 定義しています。 つまり、次の 2 つの宣言は同等です。
var optionalInteger: Int?
var optionalInteger: Optional<Int>
In both cases, the variable optionalInteger
is declared to have the type of an optional integer. Note that no whitespace may appear between the type and the ?
.
どちらの場合も、変数 optionalInteger
はオプションの整数の型を持つように宣言されます。 型と?
の間に空白を入れてはいけないことに注意してください。
The type Optional<Wrapped>
is an enumeration with two cases, none
and some(Wrapped)
, which are used to represent values that may or may not be present. Any type can be explicitly declared to be (or implicitly converted to) an optional type. If you don’t provide an initial value when you declare an optional variable or property, its value automatically defaults to nil
.
Optional<Wrapped>
型は、none
と some(Wrapped)
の 2 つのケースを含む列挙で、存在する場合と存在しない場合がある値を表すために使用されます。 どの型もオプションの型として明示的に宣言 (または暗黙的に変換) できます。 オプションの変数またはプロパティを宣言するときに初期値を指定しない場合、その値は自動的にデフォルトの nil
に設定されます。
If an instance of an optional type contains a value, you can access that value using the postfix operator !
, as shown below:
オプションの型のインスタンスに値が含まれている場合は、以下に示すように、後置演算子 !
を使用してその値にアクセスできます。
optionalInteger = 42
optionalInteger! // 42
Using the !
operator to unwrap an optional that has a value of nil
results in a runtime error.
!
演算子を使用して値が nil
のオプションをアンラップすると、実行時エラーが発生します。
You can also use optional chaining and optional binding to conditionally perform an operation on an optional expression. If the value is nil
, no operation is performed and therefore no runtime error is produced.
オプションのチェーンとオプションのバインディングを使用して、オプションの式に対して条件付きで操作を実行することもできます。 値が nil
の場合、操作は実行されないため、実行時エラーは生成されません。
For more information and to see examples that show how to use optional types, see Optionals.
詳細とオプションのタイプの使用方法を示す例については、「オプション」を参照してください。
Grammar of an optional type
optional-type → type ?
Implicitly Unwrapped Optional Type
暗黙的にアンラップされたオプションの型
The Swift language defines the postfix !
as syntactic sugar for the named type Optional<Wrapped>
, which is defined in the Swift standard library, with the additional behavior that it’s automatically unwrapped when it’s accessed. If you try to use an implicitly unwrapped optional that has a value of nil
, you’ll get a runtime error. With the exception of the implicit unwrapping behavior, the following two declarations are equivalent:
Swift 言語は後置演算子!
を Swift 標準ライブラリで定義され、アクセス時に自動的にラップが解除されるという追加の動作が付いている、名前付き型 Optional<Wrapped>
の糖衣構文として定義しています。 値が nil
の暗黙的にアンラップされたオプションを使用しようとすると、ランタイム エラーが発生します。 暗黙的なアンラップ動作を除けば、次の 2 つの宣言は同等です。
var implicitlyUnwrappedString: String!
var explicitlyUnwrappedString: Optional<String>
Note that no whitespace may appear between the type and the !
.
型と!
の間に空白を入れてはいけないことに注意してください。
Because implicit unwrapping changes the meaning of the declaration that contains that type, optional types that are nested inside a tuple type or a generic type — such as the element types of a dictionary or array — can’t be marked as implicitly unwrapped. For example:
暗黙的なアンラップでは、その型を含む宣言の意味が変更されるため、タプル型またはジェネリック型内にネストされているオプションの型 (辞書や配列の要素型など) は、暗黙的にアンラップされるものとしてマークできません。 例えば:
let tupleOfImplicitlyUnwrappedElements: (Int!, Int!) // Error
let implicitlyUnwrappedTuple: (Int, Int)! // OK
let arrayOfImplicitlyUnwrappedElements: [Int!] // Error
let implicitlyUnwrappedArray: [Int]! // OK
Because implicitly unwrapped optionals have the same Optional<Wrapped>
type as optional values, you can use implicitly unwrapped optionals in all the same places in your code that you can use optionals. For example, you can assign values of implicitly unwrapped optionals to variables, constants, and properties of optionals, and vice versa.
暗黙的にラップ解除されたオプションはオプションの値と同じ Optional<Wrapped>
型を持つため、オプションを使用できるコード内のすべての同じ場所で暗黙的にラップ解除されたオプションを使用できます。 たとえば、暗黙的にラップされていないオプションの値を変数、定数、オプションのプロパティに代入したり、その逆を行うことができます。
As with optionals, if you don’t provide an initial value when you declare an implicitly unwrapped optional variable or property, its value automatically defaults to nil
.
オプションの場合と同様、暗黙的にアンラップされたオプションの変数またはプロパティを宣言するときに初期値を指定しない場合、その値は自動的にデフォルトで nil
に設定されます。
Use optional chaining to conditionally perform an operation on an implicitly unwrapped optional expression. If the value is nil
, no operation is performed and therefore no runtime error is produced.
オプションのチェーンを使用して、暗黙的にラップされていないオプションの式に対して条件付きで操作を実行します。 値が nil
の場合、操作は実行されないため、実行時エラーは生成されません。
For more information about implicitly unwrapped optional types, see Implicitly Unwrapped Optionals.
暗黙的にラップ解除されるオプションのタイプの詳細については、「暗黙的にラップ解除されるオプション」を参照してください。
Grammar of an implicitly unwrapped optional type
implicitly-unwrapped-optional-type → type !
Protocol Composition Type
プロトコル構成型
A protocol composition type defines a type that conforms to each protocol in a list of specified protocols, or a type that’s a subclass of a given class and conforms to each protocol in a list of specified protocols. Protocol composition types may be used only when specifying a type in type annotations, in generic parameter clauses, and in generic where
clauses.
プロトコル構成タイプは、指定されたプロトコルのリスト内の各プロトコルに準拠するタイプ、または指定されたクラスのサブクラスであり、指定されたプロトコルのリスト内の各プロトコルに準拠するタイプを定義します。 プロトコル合成タイプは、タイプ アノテーション、汎用パラメータ句、および汎用 WHERE
句でタイプを指定する場合にのみ使用できます。
Protocol composition types have the following form:
プロトコル構成タイプの形式は次のとおりです。
<#Protocol 1#> & <#Protocol 2#>
A protocol composition type allows you to specify a value whose type conforms to the requirements of multiple protocols without explicitly defining a new, named protocol that inherits from each protocol you want the type to conform to. For example, you can use the protocol composition type ProtocolA & ProtocolB & ProtocolC
instead of declaring a new protocol that inherits from ProtocolA
, ProtocolB
, and ProtocolC
. Likewise, you can use SuperClass & ProtocolA
instead of declaring a new protocol that’s a subclass of SuperClass
and conforms to ProtocolA
.
プロトコル合成タイプを使用すると、タイプを準拠させたい各プロトコルを継承する新しい名前付きプロトコルを明示的に定義せずに、そのタイプが複数のプロトコルの要件に準拠する値を指定できます。 たとえば、ProtocolA
、ProtocolB
、ProtocolC
を継承する新しいプロトコルを宣言する代わりに、プロトコル構成タイプ ProtocolA & ProtocolB & ProtocolC
を使用できます。 同様に、SuperClass
のサブクラスで ProtocolA
に準拠する新しいプロトコルを宣言する代わりに、 SuperClass & ProtocolA
を使用することもできます。
Each item in a protocol composition list is one of the following; the list can contain at most one class:
プロトコル構成リストの各項目は次のいずれかです。 リストには最大 1 つのクラスを含めることができます。
- The name of a class
- クラスの名前
- The name of a protocol
- プロトコルの名前
- A type alias whose underlying type is a protocol composition type, a protocol, or a class.
- 基礎となる型がプロトコル構成型、プロトコル、またはクラスである型エイリアス。
When a protocol composition type contains type aliases, it’s possible for the same protocol to appear more than once in the definitions — duplicates are ignored. For example, the definition of PQR
in the code below is equivalent to P & Q & R
.
プロトコル構成タイプにタイプ エイリアスが含まれている場合、定義内に同じプロトコルが複数回出現する可能性があります。重複は無視されます。 たとえば、以下のコードの PQR
の定義は、P & Q & R
と同等です。
typealias PQ = P & Q
typealias PQR = PQ & Q & R
Grammar of a protocol composition type
protocol-composition-type → type-identifier &
protocol-composition-continuation
protocol-composition-continuation → type-identifier | protocol-composition-type
Opaque Type
不透明型
An opaque type defines a type that conforms to a protocol or protocol composition, without specifying the underlying concrete type.
不透明型は、基礎となる具象型を指定せずに、プロトコルまたはプロトコル構成に準拠する型を定義します。
Opaque types appear as the return type of a function or subscript, or the type of a property. Opaque types can’t appear as part of a tuple type or a generic type, such as the element type of an array or the wrapped type of an optional.
不透明型は、関数または添字の戻り値の型、またはプロパティの型として表示されます。 不透明型は、タプル型やジェネリック型 (配列の要素型やオプションのラップされた型など) の一部として使用できません。
Opaque types have the following form:
不透明型の形式は次のとおりです。
some <#constraint#>
The constraint is a class type, protocol type, protocol composition type, or Any
. A value can be used as an instance of the opaque type only if it’s an instance of a type that conforms to the listed protocol or protocol composition, or inherits from the listed class. Code that interacts with an opaque value can use the value only in ways that are part of the interface defined by the constraint.
制約は、クラス タイプ、プロトコル タイプ、プロトコル構成タイプ、または Any
です。 値は、リストされたプロトコルまたはプロトコル構成に準拠する型のインスタンスである場合、またはリストされたクラスから継承する場合にのみ、不透明型のインスタンスとして使用できます。 不透明な値を操作するコードは、制約によって定義されたインターフェースの一部である方法でのみ値を使用できます。
At compile time, a value whose type is opaque has a specific concrete type, and Swift can use that underlying type for optimizations. However, the opaque type forms a boundary that information about that underlying type can’t cross.
コンパイル時に、型が不透明である値には特定の具象型があり、Swift はその基になる型を最適化に使用できます。 ただし、不透明な型は、その基礎となる型に関する情報が越えることのできない境界を形成します。
Protocol declarations can’t include opaque types. Classes can’t use an opaque type as the return type of a nonfinal method.
プロトコル宣言には不透明型を含めることはできません。 クラスは、非finalメソッドの戻り値の型として不透明型を使用できません。
A function that uses an opaque type as its return type must return values that share a single underlying type. The return type can include types that are part of the function’s generic type parameters. For example, a function someFunction<T>()
could return a value of type T
or Dictionary<String, T>
.
戻り値の型として不透明型を使用する関数は、単一の基礎となる型を共有する値を返す必要があります。 戻り値の型には、関数のジェネリック型パラメーターの一部である型を含めることができます。 たとえば、関数someFunction<T>()
は、型 T
または Dictionary<String, T>
の値を返すことができます。
Grammar of an opaque type
opaque-type → some
type
Boxed Protocol Type
ボックス化されたプロトコル型
A boxed protocol type defines a type that conforms to a protocol or protocol composition, with the ability for that conforming type to vary while the program is running.
ボックス化されたプロトコル 型は、プロトコルまたはプロトコル構成に準拠する型を定義し、その準拠型はプログラムの実行中に変更できます。
Boxed protocol types have the following form:
ボックス化されたプロトコル 型は次の形式になります。
any <#constraint#>
The constraint is a protocol type, protocol composition type, a metatype of a protocol type, or a metatype of a protocol composition type.
制約は、プロトコル 型、プロトコル構成型、プロトコル 型のメタタイプ、またはプロトコル構成タイプのメタタイプです。
At runtime, an instance of a boxed protocol type can contain a value of any type that satisfies the constraint. This behavior contrasts with how an opaque types work, where there is some specific conforming type known at compile time. The additional level of indirection that’s used when working with a boxed protocol type is called :newTerm:boxing
. Boxing typically requires a separate memory allocation for storage and an additional level of indirection for access, which incurs a performance cost at runtime.
実行時、ボックス化されたプロトコル 型のインスタンスには、制約を満たす任意の型の値を含めることができます。 この動作は、コンパイル時に既知の特定の適合型が存在する不透明型の動作とは対照的です。 ボックス化されたプロトコル 型を操作するときに使用される追加の間接レベルは、:newTerm:boxing
と呼ばれます。 通常、ボックス化ではストレージ用に別のメモリ割り当てが必要となり、アクセス用に追加レベルの間接化が必要となり、実行時にパフォーマンス コストが発生します。
Applying any
to the Any
or AnyObject
types has no effect, because those types are already boxed protocol types.
Any
または AnyObject
型に any
を適用しても、これらの型はすでにボックス化されたプロトコル 型であるため、効果はありません。
Grammar of a boxed protocol type
boxed-protocol-type → any
type
Metatype Type
メタタイプ型
A metatype type refers to the type of any type, including class types, structure types, enumeration types, and protocol types.
メタタイプ 型とは、クラス 型、構造型、列挙型、プロトコル 型など、あらゆるタイプの型を指します。
The metatype of a class, structure, or enumeration type is the name of that type followed by .Type
. The metatype of a protocol type — not the concrete type that conforms to the protocol at runtime — is the name of that protocol followed by .Protocol
. For example, the metatype of the class type SomeClass
is SomeClass.Type
and the metatype of the protocol SomeProtocol
is SomeProtocol.Protocol
.
クラス、構造体、または列挙型のメタタイプは、その型の名前の後に .Type
が続いたものです。 プロトコル 型のメタタイプ (実行時にプロトコルに準拠する具体的な型ではありません) は、そのプロトコルの名前の後に.Protocol
が続くものです。 たとえば、クラスタイプ SomeClass
のメタタイプは SomeClass.Type
で、プロトコル SomeProtocol
のメタタイプは SomeProtocol.Protocol
です。
You can use the postfix self
expression to access a type as a value. For example, SomeClass.self
returns SomeClass
itself, not an instance of SomeClass
. And SomeProtocol.self
returns SomeProtocol
itself, not an instance of a type that conforms to SomeProtocol
at runtime. You can call the type(of:)
function with an instance of a type to access that instance’s dynamic, runtime type as a value, as the following example shows:
後置演算子self
式を使用して、型に値としてアクセスできます。 たとえば、SomeClass.self
は、SomeClass
のインスタンスではなく、SomeClass
自体を返します。 また、SomeProtocol.self
は、実行時に SomeProtocol
に準拠する型のインスタンスではなく、SomeProtocol
自体を返します。 次の例に示すように、型のインスタンスを使用して type(of:)
関数を呼び出して、そのインスタンスの動的なランタイム型に値としてアクセスできます。
class SomeBaseClass {
class func printClassName() {
print("SomeBaseClass")
}
}
class SomeSubClass: SomeBaseClass {
override class func printClassName() {
print("SomeSubClass")
}
}
let someInstance: SomeBaseClass = SomeSubClass()
// The compile-time type of someInstance is SomeBaseClass,
// and the runtime type of someInstance is SomeSubClass
type(of: someInstance).printClassName()
// Prints "SomeSubClass"
For more information, see type(of:)
(Link:developer.apple.com) in the Swift standard library.
詳細については、Swift 標準ライブラリの type(of:)
(Link:developer.apple.com)(英語) を参照してください。
Use an initializer expression to construct an instance of a type from that type’s metatype value. For class instances, the initializer that’s called must be marked with the required
keyword or the entire class marked with the final
keyword.
初期化子式を使用して、型のメタタイプ値からその型のインスタンスを構築します。 クラス インスタンスの場合、呼び出されるイニシャライザはrequired
キーワードでマークされるか、クラス全体がfinal
キーワードでマークされる必要があります。
class AnotherSubClass: SomeBaseClass {
let string: String
required init(string: String) {
self.string = string
}
override class func printClassName() {
print("AnotherSubClass")
}
}
let metatype: AnotherSubClass.Type = AnotherSubClass.self
let anotherInstance = metatype.init(string: "some string")
Grammar of a metatype type
metatype-type → type .
Type
| type .
Protocol
Any Type
Any型
The Any
type can contain values from all other types. Any
can be used as the concrete type for an instance of any of the following types:
Any
型には、他のすべての型の値を含めることができます。 Any
は、次のいずれかの型のインスタンスの具象型として使用できます。
- A class, structure, or enumeration
- クラス、構造体、または列挙型
- A metatype, such as
Int.self
- Int.self などのメタタイプ
- A tuple with any types of components
- 任意の型のコンポーネントを含むタプル
- A closure or function type
- クロージャまたは関数の型
let mixed: [Any] = ["one", 2, true, (4, 5.3), { () -> Int in return 6 }]
When you use Any
as a concrete type for an instance, you need to cast the instance to a known type before you can access its properties or methods. Instances with a concrete type of Any
maintain their original dynamic type and can be cast to that type using one of the type-cast operators — as
, as?
, or as!
. For example, use as?
to conditionally downcast the first object in a heterogeneous array to a String
as follows:
インスタンスの具象型として Any
を使用する場合、そのプロパティやメソッドにアクセスする前に、インスタンスを既知の型にキャストする必要があります。 Any
の具象型を持つインスタンスは、元の動的型を維持し、型キャスト演算子 (as
、as?
、または as!
) のいずれかを使用してその型にキャストできます。 たとえば、as?
を使い、異種配列内の最初のオブジェクトを条件付きで String
にダウンキャストします。
if let first = mixed.first as? String {
print("The first item, '\(first)', is a string.")
}
// Prints "The first item, 'one', is a string."
For more information about casting, see Type Casting.
キャストの詳細については、「型キャスト」を参照してください。
The AnyObject
protocol is similar to the Any
type. All classes implicitly conform to AnyObject
. Unlike Any
, which is defined by the language, AnyObject
is defined by the Swift standard library. For more information, see Class-Only Protocols and AnyObject
(Link:developer.apple.com).
AnyObject プロトコルは、Any タイプに似ています。 すべてのクラスは暗黙的に AnyObject に準拠します。 言語によって定義される Any とは異なり、AnyObject は Swift 標準ライブラリによって定義されます。 詳細については、「クラス専用プロトコル」と「AnyObject
(Link:developer.apple.com)(英語)」を参照してください。
Grammar of an Any type
any-type → Any
Self Type
セルフ型
The Self
type isn’t a specific type, but rather lets you conveniently refer to the current type without repeating or knowing that type’s name.
Self
型は特定の型ではなく、その型の名前を繰り返したり知らなくても、現在の型を簡単に参照できるようにします。
In a protocol declaration or a protocol member declaration, the Self
type refers to the eventual type that conforms to the protocol.
プロトコル宣言またはプロトコル メンバー宣言では、Self
型はプロトコルに準拠する最終的な型を指します。
In a structure, class, or enumeration declaration, the Self
type refers to the type introduced by the declaration. Inside the declaration for a member of a type, the Self
type refers to that type. In the members of a class declaration, Self
can appear only as follows:
構造体、クラス、または列挙型の宣言では、Self
型は宣言によって導入された型を指します。 型のメンバーの宣言内で、Self
型はその型を参照します。 クラス宣言のメンバーでは、Self
は次のようにのみ使用できます。
- As the return type of a method
- メソッドの戻り値の型として
- As the return type of a read-only subscript
- 読み取り専用添字の戻り値の型として
- As the type of a read-only computed property
- 読み取り専用の計算プロパティの型として
- In the body of a method
- メソッドの本体内として
For example, the code below shows an instance method f
whose return type is Self
.
たとえば、以下のコードは、戻り値の型が Self
であるインスタンス メソッド f
を示しています。
class Superclass {
func f() -> Self { return self }
}
let x = Superclass()
print(type(of: x.f()))
// Prints "Superclass"
class Subclass: Superclass { }
let y = Subclass()
print(type(of: y.f()))
// Prints "Subclass"
let z: Superclass = Subclass()
print(type(of: z.f()))
// Prints "Subclass"
The last part of the example above shows that Self
refers to the runtime type Subclass
of the value of z
, not the compile-time type Superclass
of the variable itself.
上記の例の最後の部分は、Self
が変数自体のコンパイル時型Superclass
ではなく、z
の値の実行時型Subclass
を参照していることを示しています。
Inside a nested type declaration, the Self
type refers to the type introduced by the innermost type declaration.
ネストされた型宣言内では、Self
型は最も内側の型宣言によって導入された型を参照します。
The Self
type refers to the same type as the type(of:)
(Link:developer.apple.com) function in the Swift standard library. Writing Self.someStaticMember
to access a member of the current type is the same as writing type(of: self).someStaticMember
.
Self
型は、Swift 標準ライブラリの type(of:)
(Link:developer.apple.com)(英語) 関数と同じタイプを指します。 現在の型のメンバーにアクセスするために Self.someStaticMember
を記述することは、 type(of: self).someStaticMember
を記述することと同じです。
Grammar of a Self type
self-type → Self
Type Inheritance Clause
型継承句
A type inheritance clause is used to specify which class a named type inherits from and which protocols a named type conforms to. A type inheritance clause begins with a colon (:
), followed by a list of type identifiers.
型継承句は、名前付き型が継承するクラスと、名前付き型が準拠するプロトコルを指定するために使用されます。 型継承句はコロン (:
) で始まり、その後に型識別子のリストが続きます。
Class types can inherit from a single superclass and conform to any number of protocols. When defining a class, the name of the superclass must appear first in the list of type identifiers, followed by any number of protocols the class must conform to. If the class doesn’t inherit from another class, the list can begin with a protocol instead. For an extended discussion and several examples of class inheritance, see Inheritance.
クラス型は単一のスーパークラスから継承し、任意の数のプロトコルに準拠できます。 クラスを定義するときは、スーパークラスの名前が型識別子のリストの最初に現れ、その後にクラスが準拠する必要がある任意の数のプロトコルが続く必要があります。 クラスが別のクラスから継承していない場合、リストは代わりにプロトコルで始めることができます。 クラス継承の詳細な説明といくつかの例については、「継承」を参照してください。
Other named types can only inherit from or conform to a list of protocols. 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 together, and any type that inherits from the current protocol must conform to all of those requirements.
他の名前付き型は、プロトコルのリストから継承するか、プロトコルのリストに準拠することしかできません。 プロトコル タイプは、他のプロトコルをいくつでも継承できます。 プロトコル タイプが他のプロトコルから継承する場合、他のプロトコルからの一連の要件が集約され、現在のプロトコルから継承するタイプはそれらの要件のすべてに準拠する必要があります。
A type inheritance clause in an enumeration definition can be either a list of protocols, or in the case of an enumeration that assigns raw values to its cases, a single, named type that specifies the type of those raw values. For an example of an enumeration definition that uses a type inheritance clause to specify the type of its raw values, see Raw Values.
列挙定義の型継承句は、プロトコルのリスト、または生の値をケースに割り当てる列挙型の場合は、それらの生の値の型を指定する単一の名前付き型のいずれかにすることができます。 型継承句を使用して生の値の型を指定する列挙定義の例については、「生の値」を参照してください。
Grammar of a type inheritance clause
type-inheritance-clause → :
type-inheritance-list
type-inheritance-list → attributes? type-identifier | attributes? type-identifier ,
type-inheritance-list
Type Inference
型推論
Swift uses type inference extensively, allowing you to omit the type or part of the type of many variables and expressions in your code. For example, instead of writing var x: Int = 0
, you can write var x = 0
, omitting the type completely — the compiler correctly infers that x
names a value of type Int
. Similarly, you can omit part of a type when the full type can be inferred from context. For example, if you write let dict: Dictionary = ["A": 1]
, the compiler infers that dict
has the type Dictionary<String, Int>
.
Swift は型推論を広範囲に使用するため、コード内の多くの変数や式の型または型の一部を省略できます。 たとえば、var x: Int = 0
と書く代わりに、型を完全に省略して var x = 0
と書くことができます。コンパイラは、x
が Int
型の値を指定していると正しく推測します。 同様に、完全な型がコンテキストから推測できる場合は、型の一部を省略できます。 たとえば、let dict: Dictionary = ["A": 1]
と記述すると、コンパイラは dict
の型が Dictionary
であると推測します。
In both of the examples above, the type information is passed up from the leaves of the expression tree to its root. That is, the type of x
in var x: Int = 0
is inferred by first checking the type of 0
and then passing this type information up to the root (the variable x
).
上記のどちらの例でも、型情報は式ツリーのリーフからルートまで渡されます。 つまり、var x: Int = 0
の x
の型は、最初に 0
の型をチェックし、次にこの型情報をルート (変数 x
) に渡すことによって推測されます。
In Swift, type information can also flow in the opposite direction — from the root down to the leaves. In the following example, for instance, the explicit type annotation (: Float
) on the constant eFloat
causes the numeric literal 2.71828
to have an inferred type of Float
instead of Double
.
Swift では、型情報は逆方向 (ルートからリーフまで) に流れることもあります。 たとえば、次の例では、定数 eFloat
の明示的な型アノテーション (: Float
) により、数値リテラル 2.71828
が Double
ではなく Float
の推論型になります。
let e = 2.71828 // The type of e is inferred to be Double.
let eFloat: Float = 2.71828 // The type of eFloat is Float.
Type inference in Swift operates at the level of a single expression or statement. This means that all of the information needed to infer an omitted type or part of a type in an expression must be accessible from type-checking the expression or one of its subexpressions.
Swift の型推論は、単一の式またはステートメントのレベルで動作します。 これは、式内の省略された型または型の一部を推論するために必要なすべての情報に、式またはその部分式の 1 つの型チェックからアクセスできる必要があることを意味します。