アクセス制御
日本語を消す 英語を消す下記URLから引用し、日本語訳をつけてみました
https://docs.swift.org/swift-book/documentation/the-swift-programming-language/accesscontrol
Manage the visibility of code by declaration, file, and module.
コードの可視性を宣言、ファイル、モジュールごとに管理します。
Access control restricts access to parts of your code from code in other source files and modules. This feature enables you to hide the implementation details of your code, and to specify a preferred interface through which that code can be accessed and used.
アクセス制御により、他のソース ファイルやモジュールのコードからコードの一部へのアクセスが制限されます。 この機能を使用すると、コードの実装の詳細を非表示にしたり、そのコードにアクセスして使用できる優先インターフェイスを指定したりできます。
You can assign specific access levels to individual types (classes, structures, and enumerations), as well as to properties, methods, initializers, and subscripts belonging to those types. Protocols can be restricted to a certain context, as can global constants, variables, and functions.
特定のアクセス レベルを、個々の型 (クラス、構造体、列挙型) だけでなく、それらの型に属するプロパティ、メソッド、イニシャライザ、添字にも割り当てることができます。 プロトコルは、グローバル定数、変数、関数と同様に、特定のコンテキストに制限できます。
In addition to offering various levels of access control, Swift reduces the need to specify explicit access control levels by providing default access levels for typical scenarios. Indeed, if you are writing a single-target app, you may not need to specify explicit access control levels at all.
Swift は、さまざまなレベルのアクセス制御を提供するだけでなく、一般的なシナリオにデフォルトのアクセス レベルを提供することで、明示的なアクセス制御レベルを指定する必要性を減らします。 実際、単一ターゲットのアプリを作成している場合は、明示的なアクセス制御レベルを指定する必要がまったくない場合があります。
Note
注釈
The various aspects of your code that can have access control applied to them (properties, types, functions, and so on) are referred to as “entities” in the sections below, for brevity.
アクセス制御を適用できるコードのさまざまな側面 (プロパティ、型、関数など) は、簡潔にするために、以下のセクションでは「エンティティ」と呼ばれます。
Modules, Source Files, and (→6.0)Packages(←6.0)
モジュール、ソースファイル、(→6.0)パッケージ(←6.0)
Swift’s access control model is based on the concept of modules, source files, and (→6.0)packages(←6.0).
Swift のアクセス制御モデルは、モジュールとソースファイルと(→6.0)パッケージ(←6.0)の概念に基づいています。
A module is a single unit of code distribution — a framework or application that’s built and shipped as a single unit and that can be imported by another module with Swift’s import
keyword.
モジュールは、コード配布の単一単位です。つまり、単一単位として構築および出荷され、Swift の import
キーワードを使用して別のモジュールによってインポートできるフレームワークまたはアプリケーションです。
Each build target (such as an app bundle or framework) in Xcode is treated as a separate module in Swift. If you group together aspects of your app’s code as a stand-alone framework — perhaps to encapsulate and reuse that code across multiple applications — then everything you define within that framework will be part of a separate module when it’s imported and used within an app, or when it’s used within another framework.
Xcode の各ビルド ターゲット (アプリ バンドルやフレームワークなど) は、Swift では別のモジュールとして扱われます。 アプリのコードの側面をスタンドアロンのフレームワークとしてグループ化すると、おそらくそのコードをカプセル化し、複数のアプリケーションで再利用できるようになります。そのフレームワーク内で定義したものはすべて、アプリ内でインポートして使用されるとき、または別のフレームワーク内で使用される場合に別のモジュールの一部になります。
A source file is a single Swift source code file within a module (in effect, a single file within an app or framework). Although it’s common to define individual types in separate source files, a single source file can contain definitions for multiple types, functions, and so on.
ソース ファイルは、モジュール内の単一の Swift ソース コード ファイルです(実際には、アプリまたはフレームワーク内の単一のファイル)。 個別のソース ファイルで個々の型を定義するのが一般的ですが、1 つのソース ファイルに複数の型や関数などの定義を含めることもできます。
↓6.0
A package is a group of modules that you develop as a unit. You define the modules that form a package as part of configuring the build system you’re using, not as part of your Swift source code. For example, if you use Swift Package Manager to build your code, you define a package in your Package.swift
file using APIs from the PackageDescription(link:developer.apple.com) module, and if you use Xcode, you specify the package name in the Package Access Identifier build setting.
パッケージとは、ユニットとして開発するモジュールのグループです。パッケージを構成するモジュールは、Swift ソースコードの一部としてではなく、使用しているビルドシステムの構成の一部として定義します。たとえば、Swift Package Manager を使用してコードをビルドする場合は、PackageDescription(link:developer.apple.com) (英語)モジュールの APIs を使用して Package.swift
ファイルでパッケージを定義し、Xcode を使用する場合は、Package Access Identifier ビルド設定でパッケージ名を指定します。
↑6.0
Access Levels
アクセスレベル
Swift provides five different access levels for entities within your code. These access levels are relative to the source file in which an entity is defined, and also relative to the module that source file belongs to.
Swift では、コード内のエンティティに対して 5 つの異なるアクセス レベルが提供されます。 これらのアクセス レベルは、エンティティが定義されているソース ファイルに相対的であり、また、そのソース ファイルが属するモジュールにも相対的です。
(↓6.0で上記を変更)
Swift provides six different access levels for entities within your code. These access levels are relative to the source file in which an entity is defined, the module that source file belongs to, and the package that the module belongs to.
Swift は、コード内のエンティティに対して 6 つの異なるアクセス レベルを提供します。これらのアクセス レベルは、エンティティが定義されているソース ファイル、ソース ファイルが属するモジュール、およびモジュールが属するパッケージを基準としています。
(↑6.0で上記を変更)
- Open access and public access enable entities to be used within any source file from their defining module, and also in a source file from another module that imports the defining module. You typically use open or public access when specifying the public interface to a framework. The difference between open and public access is described below.
- オープン アクセスとパブリック アクセスにより、エンティティは、その定義モジュールからのソース ファイル内で使用できるほか、定義モジュールをインポートする別のモジュールからのソース ファイル内でも使用できるようになります。 フレームワークへのパブリック インターフェイスを指定する場合は、通常、オープン アクセスまたはパブリック アクセスを使用します。 オープンアクセスとパブリックアクセスの違いについては以下で説明します。
- (6.0)Package access enables entities to be used within any source files from their defining package but not in any source file outside of that package. You typically use package access within an app or framework that’s structured into multiple modules.
- (6.0)パッケージ アクセスを使用すると、エンティティをその定義パッケージの任意のソース ファイル内で使用できるようになりますが、そのパッケージ外のソース ファイル内では使用できません。通常、パッケージ アクセスは、複数のモジュールに構造化されたアプリまたはフレームワーク内で使用します。
- Internal access enables entities to be used within any source file from their defining module, but not in any source file outside of that module. You typically use internal access when defining an app’s or a framework’s internal structure.
- 内部アクセスにより、エンティティはその定義モジュールから任意のソース ファイル内で使用できますが、そのモジュール外のソース ファイルでは使用できません。 通常、アプリまたはフレームワークの内部構造を定義する場合は、内部アクセスを使用します。
- File-private access restricts the use of an entity to its own defining source file. Use file-private access to hide the implementation details of a specific piece of functionality when those details are used within an entire file.
- ファイル プライベート アクセスでは、エンティティの使用が独自の定義ソース ファイルに制限されます。 ファイルプライベート アクセスを使用すると、特定の機能部分の実装の詳細がファイル全体内で使用される場合に、その詳細を非表示にできます。
- Private access restricts the use of an entity to the enclosing declaration, and to extensions of that declaration that are in the same file. Use private access to hide the implementation details of a specific piece of functionality when those details are used only within a single declaration.
- プライベート アクセスでは、エンティティの使用が、それを囲んでいる宣言と、同じファイル内にあるその宣言の拡張子に制限されます。 機能の特定の部分の実装の詳細が 1 つの宣言内でのみ使用される場合は、プライベート アクセスを使用してそれらの詳細を非表示にします。
Open access is the highest (least restrictive) access level and private access is the lowest (most restrictive) access level.
オープン アクセスは最も高い (制限が最も緩い) アクセス レベルであり、プライベート アクセスは最も低い (制限が最も緩い) アクセス レベルです。
Open access applies only to classes and class members, and it differs from public access by allowing code outside the module to subclass and override, as discussed below in Subclassing. Marking a class as open explicitly indicates that you’ve considered the impact of code from other modules using that class as a superclass, and that you’ve designed your class’s code accordingly.
オープン アクセスはクラスとクラス メンバーにのみ適用され、以下の「サブクラス化」で説明するように、モジュール外のコードをサブクラス化してオーバーライドできるという点でパブリック アクセスとは異なります。 クラスをオープンとしてマークすることは、そのクラスをスーパークラスとして使用する他のモジュールからのコードの影響を考慮し、それに応じてクラスのコードを設計したことを明示します。
Guiding Principle of Access Levels
アクセスレベルの基本原則
Access levels in Swift follow an overall guiding principle: No entity can be defined in terms of another entity that has a lower (more restrictive) access level.
Swift のアクセス レベルは、全体的な指針に従っています。つまり、より低い (より制限的な) アクセス レベルを持つ別のエンティティに関してエンティティを定義することはできません。
For example:
例えば:
- A public variable can’t be defined as having an internal, file-private, or private type, because the type might not be available everywhere that the public variable is used.
- パブリック変数が内部型、ファイルプライベート型、またはプライベート型を持つように定義することはできません。パブリック変数が使用される場所ではその型が利用できない可能性があるためです。
- A function can’t have a higher access level than its parameter types and return type, because the function could be used in situations where its constituent types are unavailable to the surrounding code.
- 関数は、その構成要素の型が周囲のコードで使用できない状況で使用される可能性があるため、パラメーターの型や戻り値の型よりも高いアクセス レベルを持つことはできません。
The specific implications of this guiding principle for different aspects of the language are covered in detail below.
この指針が言語のさまざまな側面に与える具体的な影響については、以下で詳しく説明します。
Default Access Levels
デフォルトのアクセスレベル
All entities in your code (with a few specific exceptions, as described later in this chapter) have a default access level of internal if you don’t specify an explicit access level yourself. As a result, in many cases you don’t need to specify an explicit access level in your code.
自分で明示的なアクセス レベルを指定しない場合、コード内のすべてのエンティティ (この章で後述するように、いくつかの特定の例外を除く) のデフォルトのアクセス レベルは、内部です。 その結果、多くの場合、コード内で明示的なアクセス レベルを指定する必要はありません。
Access Levels for Single-Target Apps
単一ターゲット アプリのアクセス レベル
When you write a simple single-target app, the code in your app is typically self-contained within the app and doesn’t need to be made available outside of the app’s module. The default access level of internal already matches this requirement. Therefore, you don’t need to specify a custom access level. You may, however, want to mark some parts of your code as file private or private in order to hide their implementation details from other code within the app’s module.
単純な単一ターゲット アプリを作成する場合、アプリ内のコードは通常、アプリ内に自己完結型であり、アプリのモジュールの外部で利用できるようにする必要はありません。 内部のデフォルトのアクセス レベルはすでにこの要件に一致しています。 したがって、カスタム アクセス レベルを指定する必要はありません。 ただし、アプリのモジュール内の他のコードからその実装の詳細を隠すために、コードの一部をファイル プライベートまたはプライベートとしてマークすることもできます。
Access Levels for Frameworks
フレームワークのアクセスレベル
When you develop a framework, mark the public-facing interface to that framework as open or public so that it can be viewed and accessed by other modules, such as an app that imports the framework. This public-facing interface is the application programming interface (or API) for the framework.
フレームワークを開発するときは、そのフレームワークへの公開インターフェイスをオープンまたはパブリックとしてマークし、フレームワークをインポートするアプリなどの他のモジュールから表示およびアクセスできるようにします。 この公開インターフェイスは、フレームワークのアプリケーション プログラミング インターフェイス (API) です。
Note
注釈
Any internal implementation details of your framework can still use the default access level of internal, or can be marked as private or file private if you want to hide them from other parts of the framework’s internal code. You need to mark an entity as open or public only if you want it to become part of your framework’s API.
フレームワークの内部実装の詳細は、引き続き内部のデフォルトのアクセス レベルを使用できます。また、フレームワークの内部コードの他の部分から非表示にしたい場合は、プライベートまたはファイル プライベートとしてマークすることもできます。 エンティティをフレームワークの API の一部にしたい場合にのみ、エンティティをオープンまたはパブリックとしてマークする必要があります。
Access Levels for Unit Test Targets
単体テストターゲットのアクセスレベル
When you write an app with a unit test target, the code in your app needs to be made available to that module in order to be tested. By default, only entities marked as open or public are accessible to other modules. However, a unit test target can access any internal entity, if you mark the import declaration for a product module with the @testable
attribute and compile that product module with testing enabled.
単体テスト ターゲットを使用してアプリを作成する場合、テストするにはアプリ内のコードをそのモジュールで使用できるようにする必要があります。 デフォルトでは、オープンまたはパブリックとしてマークされたエンティティのみが他のモジュールにアクセスできます。 ただし、製品モジュールのインポート宣言に @testable
属性をマークし、テストを有効にしてその製品モジュールをコンパイルした場合、単体テスト ターゲットは任意の内部エンティティにアクセスできます。
Access Control Syntax
アクセス制御構文
Define the access level for an entity by placing one of the open
, public
, internal
, fileprivate
, or private
modifiers at the beginning of the entity’s declaration.
エンティティの宣言の先頭に open
、public
、internal
、fileprivate
、または private
のいずれかの修飾子を配置して、エンティティのアクセス レベルを定義します。
open class SomeOpenClass {}
public class SomePublicClass {}
internal class SomeInternalClass {}
fileprivate class SomeFilePrivateClass {}
private class SomePrivateClass {}
open var someOpenVariable = 0
public var somePublicVariable = 0
internal let someInternalConstant = 0
fileprivate func someFilePrivateFunction() {}
private func somePrivateFunction() {}
Unless otherwise specified, the default access level is internal, as described in Default Access Levels. This means that SomeInternalClass
and someInternalConstant
can be written without an explicit access-level modifier, and will still have an access level of internal:
特に指定がない限り、デフォルトのアクセス レベルは、「デフォルトのアクセス レベル」で説明されているように内部レベルです。 これは、SomeInternalClass
と someInternalConstant
は明示的なアクセス レベル修飾子なしで記述でき、アクセス レベルは依然として内部であることを意味します。
class SomeInternalClass {} // implicitly internal
let someInternalConstant = 0 // implicitly internal
Custom Types
カスタムタイプ
If you want to specify an explicit access level for a custom type, do so at the point that you define the type. The new type can then be used wherever its access level permits. For example, if you define a file-private class, that class can only be used as the type of a property, or as a function parameter or return type, in the source file in which the file-private class is defined.
カスタム タイプに明示的なアクセス レベルを指定する場合は、タイプを定義する時点で指定してください。 新しいタイプは、そのアクセス レベルが許可する場所であればどこでも使用できます。 たとえば、ファイル プライベート クラスを定義する場合、そのクラスは、ファイル プライベート クラスが定義されているソース ファイル内でプロパティの型として、または関数のパラメーターまたは戻り値の型としてのみ使用できます。
The access control level of a type also affects the default access level of that type’s members (its properties, methods, initializers, and subscripts). If you define a type’s access level as private or file private, the default access level of its members will also be private or file private. If you define a type’s access level as internal or public (or use the default access level of internal without specifying an access level explicitly), the default access level of the type’s members will be internal.
型のアクセス制御レベルは、その型のメンバー(プロパティ、メソッド、イニシャライザ、サブスクリプト)のデフォルトのアクセス レベルにも影響します。 型のアクセス レベルをプライベートまたはファイル プライベートとして定義すると、そのメンバーのデフォルトのアクセス レベルもプライベートまたはファイル プライベートになります。 タイプのアクセス レベルを内部またはパブリックとして定義した場合 (または、アクセス レベルを明示的に指定せずにデフォルトのアクセス レベルである内部を使用した場合)、タイプのメンバーのデフォルトのアクセス レベルは内部になります。
Important
重要
A public type defaults to having internal members, not public members. If you want a type member to be public, you must explicitly mark it as such. This requirement ensures that the public-facing API for a type is something you opt in to publishing, and avoids presenting the internal workings of a type as public API by mistake.
パブリック型には、デフォルトではパブリック メンバーではなく内部メンバーが含まれます。 型メンバーをパブリックにしたい場合は、明示的にそのようにマークする必要があります。 この要件により、型の公開 API が公開をオプトインしたものであることが保証され、型の内部動作が誤って公開 API として提示されることが回避されます。
public class SomePublicClass { // explicitly public class
public var somePublicProperty = 0 // explicitly public class member
var someInternalProperty = 0 // implicitly internal class member
fileprivate func someFilePrivateMethod() {} // explicitly file-private class member
private func somePrivateMethod() {} // explicitly private class member
}
class SomeInternalClass { // implicitly internal class
var someInternalProperty = 0 // implicitly internal class member
fileprivate func someFilePrivateMethod() {} // explicitly file-private class member
private func somePrivateMethod() {} // explicitly private class member
}
fileprivate class SomeFilePrivateClass { // explicitly file-private class
func someFilePrivateMethod() {} // implicitly file-private class member
private func somePrivateMethod() {} // explicitly private class member
}
private class SomePrivateClass { // explicitly private class
func somePrivateMethod() {} // implicitly private class member
}
Tuple Types
タプル(組)型
The access level for a tuple type is the most restrictive access level of all types used in that tuple. For example, if you compose a tuple from two different types, one with internal access and one with private access, the access level for that compound tuple type will be private.
タプル タイプのアクセス レベルは、そのタプルで使用されるすべてのタイプの中で最も制限の厳しいアクセス レベルです。 たとえば、2 つの異なるタイプ (1 つは内部アクセス、もう 1 つはプライベート アクセス) からタプルを構成する場合、その複合タプル タイプのアクセス レベルはプライベートになります。
Note
注釈
Tuple types don’t have a standalone definition in the way that classes, structures, enumerations, and functions do. A tuple type’s access level is determined automatically from the types that make up the tuple type, and can’t be specified explicitly.
タプル型には、クラス、構造体、列挙型、関数のようなスタンドアロンの定義がありません。 タプル型のアクセス レベルは、タプル型を構成する型から自動的に決定され、明示的に指定することはできません。
Function Types
関数型
The access level for a function type is calculated as the most restrictive access level of the function’s parameter types and return type. You must specify the access level explicitly as part of the function’s definition if the function’s calculated access level doesn’t match the contextual default.
関数型のアクセス レベルは、関数のパラメータ型と戻り値の型のうち最も制限の厳しいアクセス レベルとして計算されます。 関数の計算されたアクセス レベルがコンテキストのデフォルトと一致しない場合は、関数の定義の一部としてアクセス レベルを明示的に指定する必要があります。
The example below defines a global function called someFunction()
, without providing a specific access-level modifier for the function itself. You might expect this function to have the default access level of “internal”, but this isn’t the case. In fact, someFunction()
won’t compile as written below:
以下の例では、関数自体に特定のアクセスレベル修飾子を提供せずに、someFunction() というグローバル関数を定義しています。 この関数のデフォルトのアクセス レベルは「内部」であると予想されるかもしれませんが、そうではありません。 実際、someFunction()
は以下のようにコンパイルできません。
func someFunction() -> (SomeInternalClass, SomePrivateClass) {
// function implementation goes here
}
The function’s return type is a tuple type composed from two of the custom classes defined above in Custom Types. One of these classes is defined as internal, and the other is defined as private. Therefore, the overall access level of the compound tuple type is private (the minimum access level of the tuple’s constituent types).
関数の戻り値の型は、上記の「カスタム型」で定義した 2 つのカスタム クラスから構成されるタプル型です。 これらのクラスの 1 つは内部として定義され、もう 1 つはプライベートとして定義されます。 したがって、複合タプル型の全体的なアクセス レベルはプライベート (タプルの構成要素型の最小アクセス レベル) です。
Because the function’s return type is private, you must mark the function’s overall access level with the private
modifier for the function declaration to be valid:
関数の戻り値の型は private であるため、関数宣言を有効にするには、関数全体のアクセス レベルを private
修飾子でマークする必要があります。
private func someFunction() -> (SomeInternalClass, SomePrivateClass) {
// function implementation goes here
}
It’s not valid to mark the definition of someFunction()
with the public
or internal
modifiers, or to use the default setting of internal, because public or internal users of the function might not have appropriate access to the private class used in the function’s return type.
someFunction()
の定義を public
修飾子や internal
修飾子でマークしたり、デフォルト設定の internal
を使用したりすることは無効です。関数のパブリック ユーザーまたは内部ユーザーは、関数の戻り値の型で使用されるプライベート クラスに適切なアクセス権を持たない可能性があるためです。
Enumeration Types
列挙型
The individual cases of an enumeration automatically receive the same access level as the enumeration they belong to. You can’t specify a different access level for individual enumeration cases.
列挙の個々のケースは、それらが属する列挙と同じアクセス レベルを自動的に受け取ります。 個々の列挙ケースに異なるアクセス レベルを指定することはできません。
In the example below, the CompassPoint
enumeration has an explicit access level of public. The enumeration cases north
, south
, east
, and west
therefore also have an access level of public:
以下の例では、CompassPoint
列挙の明示的なアクセス レベルは public です。 したがって、north
、south
、east
、west
の列挙ケースもパブリックのアクセス レベルです。
public enum CompassPoint {
case north
case south
case east
case west
}
Raw Values and Associated Values
生の値と関連する値
The types used for any raw values or associated values in an enumeration definition must have an access level at least as high as the enumeration’s access level. For example, you can’t use a private type as the raw-value type of an enumeration with an internal access level.
列挙定義内の生の値または関連する値に使用される型には、少なくとも列挙のアクセス レベルと同じ高いアクセス レベルが必要です。 たとえば、内部アクセス レベルを持つ列挙体の raw 値型としてプライベート型を使用することはできません。
Nested Types
入れ子になった型
The access level of a nested type is the same as its containing type, unless the containing type is public. Nested types defined within a public type have an automatic access level of internal. If you want a nested type within a public type to be publicly available, you must explicitly declare the nested type as public.
入れ子になった型のアクセス レベルは、含まれる型がパブリックでない限り、その型と同じです。 パブリック型内で定義された入れ子型の自動アクセス レベルは内部です。 パブリック型内の入れ子になった型をパブリックに使用できるようにするには、入れ子になった型を明示的にパブリックとして宣言する必要があります。
Subclassing
サブクラス化
You can subclass any class that can be accessed in the current access context and that’s defined in the same module as the subclass. You can also subclass any open class that’s defined in a different module. A subclass can’t have a higher access level than its superclass — for example, you can’t write a public subclass of an internal superclass.
現在のアクセス コンテキストでアクセスでき、サブクラスと同じモジュールで定義されているクラスをサブクラス化できます。 別のモジュールで定義されているオープン クラスをサブクラス化することもできます。 サブクラスは、そのスーパークラスよりも高いアクセス レベルを持つことはできません。たとえば、内部スーパークラスのパブリック サブクラスを作成することはできません。
In addition, for classes that are defined in the same module, you can override any class member (method, property, initializer, or subscript) that’s visible in a certain access context. For classes that are defined in another module, you can override any open class member.
さらに、同じモジュール内で定義されているクラスの場合、特定のアクセス コンテキストで表示されるクラス メンバー (メソッド、プロパティ、イニシャライザ、またはサブスクリプト) をオーバーライドできます。 別のモジュールで定義されているクラスの場合は、開いているクラスのメンバーをオーバーライドできます。
An override can make an inherited class member more accessible than its superclass version. In the example below, class A
is a public class with a file-private method called someMethod()
. Class B
is a subclass of A
, with a reduced access level of “internal”. Nonetheless, class B
provides an override of someMethod()
with an access level of “internal”, which is higher than the original implementation of someMethod()
:
オーバーライドにより、継承されたクラス メンバーをそのスーパークラス バージョンよりもアクセスしやすくすることができます。 以下の例では、クラス A
は、someMethod()
と呼ばれるファイルプライベート メソッドを持つパブリック クラスです。 クラス B
は A
のサブクラスであり、アクセス レベルが「内部」に低く設定されています。 それにもかかわらず、クラス B は、someMethod()
の元の実装よりも高い「内部」アクセス レベルで someMethod()
のオーバーライドを提供します。
public class A {
fileprivate func someMethod() {}
}
internal class B: A {
override internal func someMethod() {}
}
It’s even valid for a subclass member to call a superclass member that has lower access permissions than the subclass member, as long as the call to the superclass’s member takes place within an allowed access level context (that is, within the same source file as the superclass for a file-private member call, or within the same module as the superclass for an internal member call):
スーパークラスのメンバーへの呼び出しが許可されたアクセス レベルのコンテキスト内で行われる限り、サブクラス メンバーがサブクラス メンバーよりもアクセス権限が低いスーパークラス メンバーを呼び出すことも有効です。 (つまり、ファイルプライベートメンバー呼び出しの場合はスーパークラスと同じソースファイル内、または内部メンバー呼び出しの場合はスーパークラスと同じモジュール内です。):
public class A {
fileprivate func someMethod() {}
}
internal class B: A {
override internal func someMethod() {
super.someMethod()
}
}
Because superclass A
and subclass B
are defined in the same source file, it’s valid for the B
implementation of someMethod()
to call super.someMethod()
.
スーパークラス A
とサブクラス B
は同じソース ファイルで定義されているため、someMethod()
の B
実装が super.someMethod()
を呼び出すことは有効です。
Constants, Variables, Properties, and Subscripts
定数、変数、プロパティ、および添字
A constant, variable, or property can’t be more public than its type. It’s not valid to write a public property with a private type, for example. Similarly, a subscript can’t be more public than either its index type or return type.
定数、変数、またはプロパティは、その型以上にパブリックにすることはできません。 たとえば、プライベート型を使用してパブリック プロパティを記述することは無効です。 同様に、添字はそのインデックス型または戻り値の型よりもパブリックにすることはできません。
If a constant, variable, property, or subscript makes use of a private type, the constant, variable, property, or subscript must also be marked as private
:
定数、変数、プロパティ、または添字がプライベート型を使用する場合、定数、変数、プロパティ、または添字もプライベートとしてマークする必要があります。
private var privateInstance = SomePrivateClass()
Getters and Setters
ゲッターとセッター
Getters and setters for constants, variables, properties, and subscripts automatically receive the same access level as the constant, variable, property, or subscript they belong to.
定数、変数、プロパティ、添字のゲッターとセッターは、それらが属する定数、変数、プロパティ、または添字と同じアクセス レベルを自動的に受け取ります。
You can give a setter a lower access level than its corresponding getter, to restrict the read-write scope of that variable, property, or subscript. You assign a lower access level by writing fileprivate(set)
, private(set)
, internal(set)
, or (→6.0)package(set)
(←6.0) before the var
or subscript
introducer.
セッターに、対応するゲッターよりも低いアクセス レベルを与えて、その変数、プロパティ、または添え字の読み取り/書き込みスコープを制限できます。 var または subscript イントロデューサの前に fileprivate(set)
、private(set)
、internal(set)
、 または (→6.0)package(set)
(←6.0)を記述することで、より低いアクセス レベルを割り当てます。
Note
注釈
This rule applies to stored properties as well as computed properties. Even though you don’t write an explicit getter and setter for a stored property, Swift still synthesizes an implicit getter and setter for you to provide access to the stored property’s backing storage. Use fileprivate(set)
, private(set)
, internal(set)
, and (→6.0)package(set)
(←6.0) to change the access level of this synthesized setter in exactly the same way as for an explicit setter in a computed property.
このルールは、計算されたプロパティだけでなく保存されたプロパティにも適用されます。 格納されたプロパティの明示的なゲッターとセッターを作成しなくても、Swift は暗黙的なゲッターとセッターを合成して、格納されたプロパティのバッキング ストレージへのアクセスを提供します。 fileprivate(set)
、private(set)
、internal(set)
、(→6.0)package(set)
(←6.0)を使用して、計算されたプロパティの明示的なセッターの場合とまったく同じ方法で、この合成されたセッターのアクセス レベルを変更します。
The example below defines a structure called TrackedString
, which keeps track of the number of times a string property is modified:
以下の例では、文字列プロパティが変更された回数を追跡する TrackedString という構造体を定義しています。
struct TrackedString {
private(set) var numberOfEdits = 0
var value: String = "" {
didSet {
numberOfEdits += 1
}
}
}
The TrackedString
structure defines a stored string property called value
, with an initial value of ""
(an empty string). The structure also defines a stored integer property called numberOfEdits
, which is used to track the number of times that value
is modified. This modification tracking is implemented with a didSet
property observer on the value
property, which increments numberOfEdits
every time the value
property is set to a new value.
TrackedString
構造は、value
と呼ばれる保存された文字列プロパティを定義し、初期値は「」(空の文字列)です。 この構造では、numberOfEdits
と呼ばれる保存された整数プロパティも定義されており、value
が変更された回数を追跡するために使用されます。 この変更の追跡は、value
プロパティの didSet
プロパティ オブザーバーを使用して実装されます。value
プロパティが新しい値に設定されるたびに、numberOfEdits
が増加します。
The TrackedString
structure and the value
property don’t provide an explicit access-level modifier, and so they both receive the default access level of internal. However, the access level for the numberOfEdits
property is marked with a private(set)
modifier to indicate that the property’s getter still has the default access level of internal, but the property is settable only from within code that’s part of the TrackedString
structure. This enables TrackedString
to modify the numberOfEdits
property internally, but to present the property as a read-only property when it’s used outside the structure’s definition.
TrackedString
構造と value
プロパティは明示的なアクセス レベル修飾子を提供していないため、両方とも内部のデフォルトのアクセス レベルを受け取ります。 ただし、numberOfEdits
プロパティのアクセス レベルは private(set)
修飾子でマークされており、プロパティのゲッターが依然として内部のデフォルトのアクセス レベルを持っていることを示しますが、このプロパティは TrackedString
構造の一部であるコード内からのみ設定可能です。 これにより、TrackedString
は、numberOfEdits
プロパティを内部的に変更できますが、構造の定義の外で使用される場合は、プロパティを読み取り専用プロパティとして表示できます。
If you create a TrackedString
instance and modify its string value a few times, you can see the numberOfEdits
property value update to match the number of modifications:
TrackedString
インスタンスを作成し、その文字列値を数回変更すると、numberOfEdits
プロパティ値が変更の数に一致するように更新されることがわかります。
var stringToEdit = TrackedString()
stringToEdit.value = "This string will be tracked."
stringToEdit.value += " This edit will increment numberOfEdits."
stringToEdit.value += " So will this one."
print("The number of edits is \(stringToEdit.numberOfEdits)")
// Prints "The number of edits is 3"
Although you can query the current value of the numberOfEdits
property from within another source file, you can’t modify the property from another source file. This restriction protects the implementation details of the TrackedString
edit-tracking functionality, while still providing convenient access to an aspect of that functionality.
別のソース ファイル内からnumberOfEdits
プロパティの現在の値をクエリすることはできますが、別のソース ファイルからプロパティを変更することはできません。 この制限により、TrackedString
編集追跡機能の実装の詳細が保護されると同時に、その機能の一部への便利なアクセスが提供されます。
Note that you can assign an explicit access level for both a getter and a setter if required. The example below shows a version of the TrackedString
structure in which the structure is defined with an explicit access level of public. The structure’s members (including the numberOfEdits
property) therefore have an internal access level by default. You can make the structure’s numberOfEdits
property getter public, and its property setter private, by combining the public
and private(set)
access-level modifiers:
必要に応じて、ゲッターとセッターの両方に明示的なアクセス レベルを割り当てることができることに注意してください。 以下の例は、明示的なアクセス レベル public で構造が定義されている TrackedString
構造のバージョンを示しています。 したがって、構造のメンバー(numberOfEdits
プロパティを含む)には、デフォルトで内部アクセス レベルが設定されています。 public
と private(set)
アクセスレベル修飾子を組み合わせることで、構造体のnumberOfEdits
プロパティゲッターをパブリックに、そのプロパティセッターをプライベートにできます。
public struct TrackedString {
public private(set) var numberOfEdits = 0
public var value: String = "" {
didSet {
numberOfEdits += 1
}
}
public init() {}
}
Initializers
イニシャライザ
Custom initializers can be assigned an access level less than or equal to the type that they initialize. The only exception is for required initializers (as defined in Required Initializers). A required initializer must have the same access level as the class it belongs to.
カスタムイニシャライザには、初期化する型以下のアクセス レベルを割り当てることができます。 唯一の例外は、必須のイニシャライザ(「必須のイニシャライザ」で定義されているとおり)です。 必須のイニシャライザは、それが属するクラスと同じアクセス レベルを持っている必要があります。
As with function and method parameters, the types of an initializer’s parameters can’t be more private than the initializer’s own access level.
関数およびメソッドのパラメーターと同様、イニシャライザーのパラメーターの型は、イニシャライザー自身のアクセス レベルよりもプライベートなものにすることはできません。
Default Initializers
デフォルトのイニシャライザ
As described in Default Initializers, Swift automatically provides a default initializer without any arguments for any structure or base class that provides default values for all of its properties and doesn’t provide at least one initializer itself.
「デフォルトのイニシャライザ」で説明されているように、Swift は、すべてのプロパティにデフォルト値を提供し、少なくとも 1 つのイニシャライザ自体を提供しない構造体または基本クラスの引数なしで、デフォルトのイニシャライザを自動的に提供します。
A default initializer has the same access level as the type it initializes, unless that type is defined as public
. For a type that’s defined as public
, the default initializer is considered internal. If you want a public type to be initializable with a no-argument initializer when used in another module, you must explicitly provide a public no-argument initializer yourself as part of the type’s definition.
デフォルトのイニシャライザは、その型が public
として定義されていない限り、初期化する型と同じアクセス レベルを持ちます。 public
として定義されている型の場合、デフォルトのイニシャライザは内部とみなされます。 パブリック型を別のモジュールで使用するときに引数なしのイニシャライザで初期化できるようにしたい場合は、型の定義の一部としてパブリックな引数なしのイニシャライザを自分で明示的に提供する必要があります。
Default Memberwise Initializers for Structure Types
構造体型のデフォルトのメンバーごとの初期化子
The default memberwise initializer for a structure type is considered private if any of the structure’s stored properties are private. Likewise, if any of the structure’s stored properties are file private, the initializer is file private. Otherwise, the initializer has an access level of internal.
構造体の格納されたプロパティのいずれかがプライベートである場合、構造体型のデフォルトのメンバーごとの初期化子はプライベートとみなされます。 同様に、構造体の格納されたプロパティのいずれかがファイル プライベートである場合、初期化子もファイル プライベートになります。 それ以外の場合、イニシャライザのアクセス レベルは内部になります。
As with the default initializer above, if you want a public structure type to be initializable with a memberwise initializer when used in another module, you must provide a public memberwise initializer yourself as part of the type’s definition.
上記のデフォルトのイニシャライザと同様に、パブリック構造体型を別のモジュールで使用するときにメンバーごとのイニシャライザで初期化できるようにしたい場合は、型の定義の一部としてパブリックなメンバーごとの初期化子を自分で提供する必要があります。
Protocols
プロトコル
If you want to assign an explicit access level to a protocol type, do so at the point that you define the protocol. This enables you to create protocols that can only be adopted within a certain access context.
プロトコル タイプに明示的なアクセス レベルを割り当てる場合は、プロトコルを定義する時点で割り当ててください。 これにより、特定のアクセス コンテキスト内でのみ採用できるプロトコルを作成できます。
The access level of each requirement within a protocol definition is automatically set to the same access level as the protocol. You can’t set a protocol requirement to a different access level than the protocol it supports. This ensures that all of the protocol’s requirements will be visible on any type that adopts the protocol.
プロトコル定義内の各要件のアクセス レベルは、プロトコルと同じアクセス レベルに自動的に設定されます。 プロトコル要件を、それがサポートするプロトコルとは異なるアクセス レベルに設定することはできません。 これにより、プロトコルのすべての要件が、そのプロトコルを採用するすべてのタイプで表示されるようになります。
Note
注釈
If you define a public protocol, the protocol’s requirements require a public access level for those requirements when they’re implemented. This behavior is different from other types, where a public type definition implies an access level of internal for the type’s members.
パブリック プロトコルを定義する場合、プロトコルの要件は、実装時にその要件に対するパブリック アクセス レベルを必要とします。 この動作は、パブリック型定義が型のメンバーの内部アクセス レベルを意味する他の型とは異なります。
Protocol Inheritance
プロトコルの継承
If you define a new protocol that inherits from an existing protocol, the new protocol can have at most the same access level as the protocol it inherits from. For example, you can’t write a public protocol that inherits from an internal protocol.
既存のプロトコルを継承する新しいプロトコルを定義する場合、新しいプロトコルは、継承元のプロトコルと最大でも同じアクセス レベルを持つことができます。 たとえば、内部プロトコルを継承するパブリック プロトコルを作成することはできません。
Protocol Conformance
プロトコルへの準拠
A type can conform to a protocol with a lower access level than the type itself. For example, you can define a public type that can be used in other modules, but whose conformance to an internal protocol can only be used within the internal protocol’s defining module.
型は、その型自体よりもアクセス レベルが低いプロトコルに準拠できます。 たとえば、他のモジュールで使用できるパブリック型を定義できますが、その内部プロトコルへの準拠は内部プロトコルの定義モジュール内でのみ使用できます。
The context in which a type conforms to a particular protocol is the minimum of the type’s access level and the protocol’s access level. For example, if a type is public, but a protocol it conforms to is internal, the type’s conformance to that protocol is also internal.
型が特定のプロトコルに準拠するコンテキストは、型のアクセス レベルとプロトコルのアクセス レベルの最小値です。 たとえば、型がパブリックであっても、準拠するプロトコルが内部である場合、そのプロトコルに対する型の準拠も内部になります。
When you write or extend a type to conform to a protocol, you must ensure that the type’s implementation of each protocol requirement has at least the same access level as the type’s conformance to that protocol. For example, if a public type conforms to an internal protocol, the type’s implementation of each protocol requirement must be at least internal.
プロトコルに準拠するように型を作成または拡張する場合、各プロトコル要件の型の実装が、そのプロトコルに対する型の準拠と少なくとも同じアクセス レベルを持つことを確認する必要があります。 たとえば、パブリック型が内部プロトコルに準拠している場合、その型の各プロトコル要件の実装は少なくとも内部的である必要があります。
Note
注釈
In Swift, as in Objective-C, protocol conformance is global — it isn’t possible for a type to conform to a protocol in two different ways within the same program.
Swift では、Objective-C と同様に、プロトコルの適合性はグローバルです。同じプログラム内で 2 つの異なる方法で型がプロトコルに適合することは不可能です。
Extensions
拡張機能
You can extend a class, structure, or enumeration in any access context in which the class, structure, or enumeration is available. Any type members added in an extension have the same default access level as type members declared in the original type being extended. If you extend a public or internal type, any new type members you add have a default access level of internal. If you extend a file-private type, any new type members you add have a default access level of file private. If you extend a private type, any new type members you add have a default access level of private.
クラス、構造体、または列挙体が使用可能なアクセス コンテキストで、クラス、構造体、または列挙体を拡張できます。 拡張に追加された型メンバーは、拡張される元の型で宣言された型メンバーと同じデフォルトのアクセス レベルを持ちます。 パブリック型または内部型を拡張する場合、追加する新しい型メンバーのデフォルトのアクセス レベルは内部になります。 ファイル プライベート タイプを拡張する場合、追加する新しいタイプ メンバーには、ファイル プライベートのデフォルトのアクセス レベルが設定されます。 プライベート型を拡張する場合、追加する新しいタイプのメンバーにはデフォルトのアクセス レベルがプライベートになります。
Alternatively, you can mark an extension with an explicit access-level modifier (for example, private
) to set a new default access level for all members defined within the extension. This new default can still be overridden within the extension for individual type members.
あるいは、拡張機能に明示的なアクセスレベル修飾子(private
など)をマークして、拡張機能内で定義されているすべてのメンバーに新しいデフォルトのアクセスレベルを設定することもできます。 この新しいデフォルトは、拡張機能内で個々の型メンバーに対してオーバーライドできます。
You can’t provide an explicit access-level modifier for an extension if you’re using that extension to add protocol conformance. Instead, the protocol’s own access level is used to provide the default access level for each protocol requirement implementation within the extension.
拡張機能を使用してプロトコル準拠を追加している場合、拡張機能に明示的なアクセス レベル修飾子を指定することはできません。 代わりに、プロトコル独自のアクセス レベルを使用して、拡張機能内の各プロトコル要件の実装にデフォルトのアクセス レベルが提供されます。
Private Members in Extensions
拡張機能のプライベートメンバー
Extensions that are in the same file as the class, structure, or enumeration that they extend behave as if the code in the extension had been written as part of the original type’s declaration. As a result, you can:
拡張対象のクラス、構造体、または列挙型と同じファイル内にある拡張機能は、拡張機能内のコードが元の型の宣言の一部として記述されているかのように動作します。 その結果、次のことが可能になります。
- Declare a private member in the original declaration, and access that member from extensions in the same file.
- 元の宣言でプライベート メンバーを宣言し、同じファイル内の拡張機能からそのメンバーにアクセスします。
- Declare a private member in one extension, and access that member from another extension in the same file.
- 1 つの拡張機能でプライベート メンバーを宣言し、同じファイル内の別の拡張機能からそのメンバーにアクセスします。
- Declare a private member in an extension, and access that member from the original declaration in the same file.
- 拡張機能でプライベート メンバーを宣言し、同じファイル内の元の宣言からそのメンバーにアクセスします。
This behavior means you can use extensions in the same way to organize your code, whether or not your types have private entities. For example, given the following simple protocol:
この動作は、型にプライベート エンティティがあるかどうかに関係なく、同じ方法で拡張機能を使用してコードを整理できることを意味します。 たとえば、次のような単純なプロトコルがあるとします。
protocol SomeProtocol {
func doSomething()
}
You can use an extension to add protocol conformance, like this:
次のように、拡張機能を使用してプロトコル準拠を追加できます。
struct SomeStruct {
private var privateVariable = 12
}
extension SomeStruct: SomeProtocol {
func doSomething() {
print(privateVariable)
}
}
Generics
ジェネリック
The access level for a generic type or generic function is the minimum of the access level of the generic type or function itself and the access level of any type constraints on its type parameters.
ジェネリック型またはジェネリック関数のアクセス レベルは、ジェネリック型またはジェネリック関数自体のアクセス レベルと、その型パラメーターに対する型制約のアクセス レベルの最小値です。
Type Aliases
タイプエイリアス
Any type aliases you define are treated as distinct types for the purposes of access control. A type alias can have an access level less than or equal to the access level of the type it aliases. For example, a private type alias can alias a private, file-private, internal, public, or open type, but a public type alias can’t alias an internal, file-private, or private type.
定義したタイプの別名は、アクセス制御の目的で別個のタイプとして扱われます。 型のエイリアスは、エイリアスの型のアクセス レベル以下のアクセス レベルを持つことができます。 たとえば、プライベート タイプのエイリアスは、プライベート、ファイル プライベート、内部、パブリック、またはオープン タイプのエイリアスを作成できますが、パブリック タイプのエイリアスは、内部、ファイル プライベート、またはプライベート タイプのエイリアスを作成できません。
Note
注釈
This rule also applies to type aliases for associated types used to satisfy protocol conformances.
この規則は、プロトコル準拠を満たすために使用される関連型の型別名にも適用されます。