Structures and Classes¶ 構造体とクラス¶
Structures and classes are general-purpose, flexible constructs that become the building blocks of your program’s code. You define properties and methods to add functionality to your structures and classes using the same syntax you use to define constants, variables, and functions. 構造体およびクラスは、あなたのプログラムのコードの建築ブロックになる、万能で、柔軟な構造物です。あなたはプロパティとメソッドを定義することで、あなたの構造体およびクラスに機能性を加えます、それには定数、変数、そして関数を定義するのにあなたが使うのと同じ構文を使います。
Unlike other programming languages, Swift doesn’t require you to create separate interface and implementation files for custom structures and classes. In Swift, you define a structure or class in a single file, and the external interface to that class or structure is automatically made available for other code to use. 他のプログラミング言語と違って、スウィフトはあなたにあつらえの構造体およびクラスのために別々のインタフェースおよび実装ファイルを作成することを要求しません。スウィフトでは、あなたはある構造体またはクラスをある単一のファイルの中で定義します、そして、そのクラスまたは構造体への外部インタフェースは自動的に他のコードが使うことが可能にされます。
Note 注意
An instance of a class is traditionally known as an object. However, Swift structures and classes are much closer in functionality than in other languages, and much of this chapter describes functionality that applies to instances of either a class or a structure type. Because of this, the more general term instance is used. クラスのインスタンスは、伝統的にオブジェクトとして知られています。しかし、スウィフトの構造体とクラスは他の言語においてよりも機能性において非常に近いものです、したがってこの章の多くはクラスまたは構造体型の両方のインスタンスに適用される機能性を記述します。これのため、より一般的な語インスタンスが使われます。
Comparing Structures and Classes¶ 構造体とクラスを比較する¶
Structures and classes in Swift have many things in common. Both can: スウィフトでの構造体とクラスは、多くのものを共通して持ちます。両方とも以下のことができます:
- Define properties to store values 値を格納するために、プロパティを定義します
- Define methods to provide functionality 機能性を提供するために、メソッドを定義します
- Define subscripts to provide access to their values using subscript syntax 添え字構文を使用してそれらの値の利用することを提供するために、添え字を定義します
- Define initializers to set up their initial state それらの初期状態を設定するために、イニシャライザを定義します
- Be extended to expand their functionality beyond a default implementation それらの機能性を元の実装を越えて広げるために、拡張されます
- Conform to protocols to provide standard functionality of a certain kind 特定の種類の標準の機能性を提供するために、プロトコルに準拠します
For more information, see Properties, Methods, Subscripts, Initialization, Extensions, and Protocols. 詳細は、プロパティ, メソッド、添え字、初期化、拡張、そしてプロトコルを見てください。
Classes have additional capabilities that structures don’t have: クラスは以下の追加の能力を持ちます、それは構造体が持たないものです:
- Inheritance enables one class to inherit the characteristics of another. 継承は、あるクラスが他のものの特徴を受け継ぐのを可能にします。
- Type casting enables you to check and interpret the type of a class instance at runtime. 型キャストは、あなたにクラスインスタンスの型を実行時に調べて解釈することを可能にします。
- Deinitializers enable an instance of a class to free up any resources it has assigned. デイニシャライザは、クラスのインスタンスにそれが代入したどんなリソースでも解放するのを可能にします。
- Reference counting allows more than one reference to a class instance. 参照カウントは、あるクラスインスタンスに対する1つ以上の参照を許します。
For more information, see Inheritance, Type Casting, Deinitialization, and Automatic Reference Counting. 詳細は、継承、型キャスト、デイニシャライズ、そして自動参照カウントを見てください。
The additional capabilities that classes support come at the cost of increased complexity. As a general guideline, prefer structures because they’re easier to reason about, and use classes when they’re appropriate or necessary. In practice, this means most of the custom data types you define will be structures and enumerations. For a more detailed comparison, see Choosing Between Structures and Classes. クラスがサポートする追加の能力は、複雑さの増加という犠牲を伴います。一般的な指針として、構造体を選んでください、なぜならそれらは推論するのがより簡単だからです、そしてそれが適切または必要である場合はクラスを使ってください。実際問題としては、これは、あなたが定義するほとんどのあつらえのデータ型は構造体や列挙になることを意味します。詳細な比較は、構造体とクラスから選ぶを見てください。
Note 注意
Classes and actors share many of the same characteristics and behaviors. For information about actors, see Concurrency. クラスおよびアクターは、多くの同じ特徴および挙動を共有します。アクターについての情報として、並行性を見てください。
Definition Syntax¶ 定義構文¶
Structures and classes have a similar definition syntax. You introduce structures with the struct
keyword and classes with the class
keyword. Both place their entire definition within a pair of braces:
構造体とクラスは、類似した定義構文を持ちます。あなたは、struct
キーワードで構造体を、そしてclass
キーワードでクラスを始めます。両方とも、それらの全ての定義を一対の波括弧の範囲内に置きます:
- struct SomeStructure {
- // structure definition goes here(構造体定義が、ここにきます)
- }
- class SomeClass {
- // class definition goes here(クラス定義が、ここにきます)
- }
Note 注意
Whenever you define a new structure or class, you define a new Swift type. Give types UpperCamelCase
names (such as SomeStructure
and SomeClass
here) to match the capitalization of standard Swift types (such as String
, Int
, and Bool
). Give properties and methods lowerCamelCase
names (such as frameRate
and incrementCount
) to differentiate them from type names.
あなたが新しいクラスまたは構造体を定義するときはいつでも、あなたはある新しいスウィフト型を定義します。それら型にUpperCamelCase アッパーキャメルケース
名(ここでのSomeStructure
やSomeClass
のような)を与えて、標準のスウィフト型(例えばString
、Int
、そしてBool
など)の大文字の使用法に合わせてください。プロパティとメソッドにlowerCamelCase ローワーキャメルケース
名(例えばframeRate
やincrementCount
など)を与えて、それらを型名と区別するようにしてください。
Here’s an example of a structure definition and a class definition: 構造体定義とクラス定義の例は、ここにあります:
- struct Resolution {
- var width = 0
- var height = 0
- }
- class VideoMode {
- var resolution = Resolution()
- var interlaced = false
- var frameRate = 0.0
- var name: String?
- }
The example above defines a new structure called Resolution
, to describe a pixel-based display resolution. This structure has two stored properties called width
and height
. Stored properties are constants or variables that are bundled up and stored as part of the structure or class. These two properties are inferred to be of type Int
by setting them to an initial integer value of 0
.
上の例は、ピクセルに基づくディスプレイ解像度を記述するために、Resolution
と呼ばれる新しい構造体を定義します。この構造体は、2つの格納プロパティ、width
とheight
と呼ばれるものを持ちます。格納プロパティは、構造体またはクラスの一部としてまとめられて格納される定数または変数です。これらの2つのプロパティは、それらを最初の整数値0
に設定することによって型Int
であると推論されます。
The example above also defines a new class called VideoMode
, to describe a specific video mode for video display. This class has four variable stored properties. The first, resolution
, is initialized with a new Resolution
structure instance, which infers a property type of Resolution
. For the other three properties, new VideoMode
instances will be initialized with an interlaced
setting of false
(meaning “noninterlaced video”), a playback frame rate of 0.0
, and an optional String
value called name
. The name
property is automatically given a default value of nil
, or “no name
value”, because it’s of an optional type.
上の例は、また、ビデオ・ディスプレイのために特定のビデオ・モードを記述するために、VideoMode
と呼ばれる新しいクラスを定義します。このクラスは、4つの変数の格納プロパティを持ちます。一番目、resolution
は、新しいResolution
構造体インスタンスで初期化されます、そしてそれは、Resolution
のプロパティ型を暗に意味します。他の3つのプロパティのために、新しいVideoMode
インスタンスは、false
に設定されるinterlaced
(「ノンインタレース・ビデオ」を意味します)、0.0
の再生フレームレート、name
というオプショナルのString
値で初期化されます。name
プロパティは省略時の値のnil
、つまり「name
値なし」を自動的に与えられます、なぜならそれがオプショナル型であるからです。
Structure and Class Instances¶ 構造体およびクラスのインスタンス¶
The Resolution
structure definition and the VideoMode
class definition only describe what a Resolution
or VideoMode
will look like. They themselves don’t describe a specific resolution or video mode. To do that, you need to create an instance of the structure or class.
Resolution
構造体定義とVideoMode
クラス定義は、Resolution
またはVideoMode
がどのようなものかについて記述するだけです。それらはそれら自体で、特定の解像度またはビデオ・モードを記述しません。それをするために、あなたは構造体またはクラスのインスタンスをつくる必要があります。
The syntax for creating instances is very similar for both structures and classes: インスタンスをつくるための構文は、構造体とクラスの両方で非常に類似しています:
- let someResolution = Resolution()
- let someVideoMode = VideoMode()
Structures and classes both use initializer syntax for new instances. The simplest form of initializer syntax uses the type name of the class or structure followed by empty parentheses, such as Resolution()
or VideoMode()
. This creates a new instance of the class or structure, with any properties initialized to their default values. Class and structure initialization is described in more detail in Initialization.
構造体とクラスは両方とも、新しいインスタンスのためにイニシャライザ構文を使います。イニシャライザ構文の最も単純な形式は、クラスまたは構造体の型名を使用して、それに空の丸括弧を続けます、例えばResolution()
またはVideoMode()
のように。これは、クラスまたは構造体の新しいインスタンスをつくり、どんなプロパティでもそれらの省略時の値に初期化されます。クラスと構造体の初期化は、更に詳細に初期化で記述されます。
Accessing Properties¶ プロパティにアクセスする¶
You can access the properties of an instance using dot syntax. In dot syntax, you write the property name immediately after the instance name, separated by a period (.
), without any spaces:
あなたは、ドット構文を使ってインスタンスのプロパティにアクセスすることができます。ドット構文において、あなたはプロパティ名をインスタンス名の直後に、終止符(.
)で区切り、どんな空白もなしで、書きます:
- print("The width of someResolution is \(someResolution.width)")
- // Prints "The width of someResolution is 0"(「someResolutionの幅は0です」を出力します)
In this example, someResolution.width
refers to the width
property of someResolution
, and returns its default initial value of 0
.
この例では、someResolution.width
はsomeResolution
のwidth
プロパティに言及して、その省略時の初期値の0
を返します。
You can drill down into subproperties, such as the width
property in the resolution
property of a VideoMode
:
あなたは、下位プロパティへと掘り下っていくことができます、例えば、あるVideoMode
のresolution
プロパティの中のwidth
プロパティ:
- print("The width of someVideoMode is \(someVideoMode.resolution.width)")
- // Prints "The width of someVideoMode is 0"(「someVideoModeの幅は0です」を出力します)
You can also use dot syntax to assign a new value to a variable property: あなたは、また、新しい値を変数プロパティに代入するためにドット構文を使うことができます:
- someVideoMode.resolution.width = 1280
- print("The width of someVideoMode is now \(someVideoMode.resolution.width)")
- // Prints "The width of someVideoMode is now 1280"(「someVideoModeの幅は、現在は1280です」を出力します)
Memberwise Initializers for Structure Types¶ 構造体型のためのメンバー関連イニシャライザ¶
All structures have an automatically generated memberwise initializer, which you can use to initialize the member properties of new structure instances. Initial values for the properties of the new instance can be passed to the memberwise initializer by name: 全ての構造体は自動的に生成されるメンバー関連イニシャライザを持ちます、それはあなたが新しい構造体インスタンスのメンバープロパティを初期化するために使うことが可能です。新しいインスタンスのプロパティのための最初の値は、名前によってメンバー関連イニシャライザに渡されることができます:
- let vga = Resolution(width: 640, height: 480)
Unlike structures, class instances don’t receive a default memberwise initializer. Initializers are described in more detail in Initialization. 構造体と違って、クラスインスタンスは、自動生成のメンバー関連イニシャライザを授けられません。イニシャライザは、更に詳細に初期化で記述されます。
Structures and Enumerations Are Value Types¶ 構造体と列挙は値型です¶
A value type is a type whose value is copied when it’s assigned to a variable or constant, or when it’s passed to a function. 値型は、それが変数または定数に代入される時に、あるいは、それが関数に渡されるときに、値がコピーされる型です。
You’ve actually been using value types extensively throughout the previous chapters. In fact, all of the basic types in Swift—integers, floating-point numbers, Booleans, strings, arrays and dictionaries—are value types, and are implemented as structures behind the scenes. あなたは、実際に前の章を通して広く値型を使っていました。実際、スウィフトにおける基本の型の全て ― 整数、浮動小数点数、ブール、文字列、配列および辞書 ― は、値型であり、そして舞台裏では構造体として実装されます。
All structures and enumerations are value types in Swift. This means that any structure and enumeration instances you create—and any value types they have as properties—are always copied when they’re passed around in your code. 全ての構造体と列挙は、スウィフトでは値型です。これは、あなたがつくるあらゆる構造体や列挙のインスタンス ― そして、それらがプロパティとして持つあらゆる値型 ― は、あなたのコードの中であちこち渡される時に常にコピーされることを意味します。
Note 注意
Collections defined by the standard library like arrays, dictionaries, and strings use an optimization to reduce the performance cost of copying. Instead of making a copy immediately, these collections share the memory where the elements are stored between the original instance and any copies. If one of the copies of the collection is modified, the elements are copied just before the modification. The behavior you see in your code is always as if a copy took place immediately. 配列、辞書、そして文字列のような、標準ライブラリによって定義されるコレクションは、ある最適化を使うことでコピーすることによる性能損失を減らします。あるコピーを直接に作る代わりに、それらコレクションは要素が格納されるところのメモリを、元のインスタンスと何らかのコピーの間で共有します。そのコレクションのいくつかのコピーのうちの1つが修正されるならば、それら要素はその修正の直前にコピーされます。あなたがあなたのコードで見るこの挙動は、常にまるである1つのコピーが直ちに生じたかのようです。
Consider this example, which uses the Resolution
structure from the previous example:
この例を考慮してください、それは、前の例からResolution
構造体を使用します:
- let hd = Resolution(width: 1920, height: 1080)
- var cinema = hd
This example declares a constant called hd
and sets it to a Resolution
instance initialized with the width and height of full HD video (1920 pixels wide by 1080 pixels high).
この例は、hd
と呼ばれる定数を宣言して、それをフルHDビデオの幅と高さ(1920ピクセル幅の広さで1080ピクセルの高さ)で初期化されるResolution
インスタンスに対して設定します。
It then declares a variable called cinema
and sets it to the current value of hd
. Because Resolution
is a structure, a copy of the existing instance is made, and this new copy is assigned to cinema
. Even though hd
and cinema
now have the same width and height, they’re two completely different instances behind the scenes.
それは、それからcinema
と呼ばれる変数を宣言して、それをhd
の現在の値に設定します。Resolution
が構造体であるので、既存のインスタンスのコピーが作成されます、そして、この新しいコピーはcinema
に代入されます。たとえhd
とcinema
が現在同じ幅と高さを持つとしても、それらは舞台裏では2つの完全に異なるインスタンスです。
Next, the width
property of cinema
is amended to be the width of the slightly wider 2K standard used for digital cinema projection (2048 pixels wide and 1080 pixels high):
次に、cinema
のwidth
プロパティは、デジタル映画館投影のために使われるわずかにより広い2Kの標準の幅(2048ピクセル幅の広さで1080ピクセルの高さ)になるように改められます:
- cinema.width = 2048
Checking the width
property of cinema
shows that it has indeed changed to be 2048
:
cinema
のwidth
プロパティをチェックすると、2048
になるように変えられたことを示します:
- print("cinema is now \(cinema.width) pixels wide")
- // Prints "cinema is now 2048 pixels wide"(「cinemaは、現在2048のピクセルの幅です」を出力します)
However, the width
property of the original hd
instance still has the old value of 1920
:
しかし、最初のhd
インスタンスのwidth
プロパティは、まだ1920
の古い値を持ちます:
- print("hd is still \(hd.width) pixels wide")
- // Prints "hd is still 1920 pixels wide"(「hdは、依然として1920のピクセルの幅です」を出力します)
When cinema
was given the current value of hd
, the values stored in hd
were copied into the new cinema
instance. The end result was two completely separate instances that contained the same numeric values. However, because they’re separate instances, setting the width of cinema
to 2048
doesn’t affect the width stored in hd
, as shown in the figure below:
cinema
がhd
の現在の値を与えられたとき、hd
に格納される値は新しいcinema
インスタンスにコピーされました。最終的な結果は2つの完全に別々のインスタンスです、そしてそれらは同じ数値を含みます。しかしながら、それらが別々のインスタンスであるので、cinema
の幅を2048
に設定することはhd
に格納される幅に影響を及ぼしません、下の図で示されるように:
The same behavior applies to enumerations: 同じ挙動は、列挙にもあてはまります:
- enum CompassPoint {
- case north, south, east, west
- mutating func turnNorth() {
- self = .north
- }
- }
- var currentDirection = CompassPoint.west
- let rememberedDirection = currentDirection
- currentDirection.turnNorth()
- print("The current direction is \(currentDirection)")
- print("The remembered direction is \(rememberedDirection)")
- // Prints "The current direction is north"
- // Prints "The remembered direction is west"
When rememberedDirection
is assigned the value of currentDirection
, it’s actually set to a copy of that value. Changing the value of currentDirection
thereafter doesn’t affect the copy of the original value that was stored in rememberedDirection
.
rememberedDirection
がcurrentDirection
の値を代入されるとき、それは実際にはその値のコピーに設定されます。それ以降にcurrentDirection
の値を変えることは、本来の値のコピーに、rememberedDirection
に格納されたものに影響を及ぼしません。
Classes Are Reference Types¶ クラスは、参照型です¶
Unlike value types, reference types are not copied when they’re assigned to a variable or constant, or when they’re passed to a function. Rather than a copy, a reference to the same existing instance is used. 値型とは異なり、参照型は、それが変数や定数に代入される時に、あるいはそれが関数に渡される時に、コピーされません。コピーではなく、既存の同じインスタンスに対する参照が使われます。
Here’s an example, using the VideoMode
class defined above:
上で定義されるVideoMode
クラスを使用している例がここにあります:
- let tenEighty = VideoMode()
- tenEighty.resolution = hd
- tenEighty.interlaced = true
- tenEighty.name = "1080i"
- tenEighty.frameRate = 25.0
This example declares a new constant called tenEighty
and sets it to refer to a new instance of the VideoMode
class. The video mode is assigned a copy of the HD resolution of 1920
by 1080
from before. It’s set to be interlaced, its name is set to "1080i"
, and its frame rate is set to 25.0
frames per second.
この例は、tenEighty
と呼ばれる新しい定数を宣言して、それをVideoMode
クラスの新しいインスタンスに言及するように設定します。ビデオ・モードは、以前にHD解像度1920
×1080
のコピーを代入されます。それはインターレースされるように設定されます、それの名前は"1080i"
に設定されます、そしてそれのフレームレートは25.0
フレーム毎秒に設定されます。
Next, tenEighty
is assigned to a new constant, called alsoTenEighty
, and the frame rate of alsoTenEighty
is modified:
次に、tenEighty
は、新しい定数、alsoTenEighty
と呼ばれるものに代入されます、そしてalsoTenEighty
のフレームレートが修正されます:
- let alsoTenEighty = tenEighty
- alsoTenEighty.frameRate = 30.0
Because classes are reference types, tenEighty
and alsoTenEighty
actually both refer to the same VideoMode
instance. Effectively, they’re just two different names for the same single instance, as shown in the figure below:
クラスが参照型であるので、tenEighty
とalsoTenEighty
は両方とも実際に同じ VideoMode
インスタンスに言及します。事実上、それらは同じ1つのインスタンスに対する単なる2つの異なる名前です、以下の図で示されるように:
Checking the frameRate
property of tenEighty
shows that it correctly reports the new frame rate of 30.0
from the underlying VideoMode
instance:
tenEighty
のframeRate
プロパティを調べてみると、それが根底にあるVideoMode
インスタンス由来の新しいフレームレートの30.0
を正しく報告することがわかります:
- print("The frameRate property of tenEighty is now \(tenEighty.frameRate)")
- // Prints "The frameRate property of tenEighty is now 30.0"(「tenEightyのframeRateプロパティは、現在は30.0です」を出力します)
This example also shows how reference types can be harder to reason about. If tenEighty
and alsoTenEighty
were far apart in your program’s code, it could be difficult to find all the ways that the video mode is changed. Wherever you use tenEighty
, you also have to think about the code that uses alsoTenEighty
, and vice versa. In contrast, value types are easier to reason about because all of the code that interacts with the same value is close together in your source files.
この例はまた、どれくらい参照型について思考するのが困難になりうるかを示します。tenEighty
とalsoTenEighty
があなたのプログラムのコードの中で離ればなれになってしまったら、ビデオモードが変更される全ての道筋を見つけるのは難しくなるかもしれません。あなたがtenEighty
を使うどこであれ、あなたはまたalsoTenEighty
を使うコードについて頭を働かせなければなりません、そして逆もまた同様に。対照的に、値型について思考するのはより簡単です、なぜなら同じ値に相互作用するコードの全ては、あなたのソースファイルの中で近接しているからです。
Note that tenEighty
and alsoTenEighty
are declared as constants, rather than variables. However, you can still change tenEighty.frameRate
and alsoTenEighty.frameRate
because the values of the tenEighty
and alsoTenEighty
constants themselves don’t actually change. tenEighty
and alsoTenEighty
themselves don’t “store” the VideoMode
instance—instead, they both refer to a VideoMode
instance behind the scenes. It’s the frameRate
property of the underlying VideoMode
that’s changed, not the values of the constant references to that VideoMode
.
tenEighty
とalsoTenEighty
が、変数ではなく、定数として宣言される点に注意してください。しかし、あなたはそれでもなおtenEighty.frameRate
とalsoTenEighty.frameRate
を変更することができます、なぜならtenEighty
およびalsoTenEighty
定数それら自身の値は実のところ変わらないからです。tenEighty
およびalsoTenEighty
それら自身はVideoMode
インスタンスを格納しません ― そうではなく、それらが両方とも言及するのは舞台裏でVideoMode
インスタンスです。それは、根底にあるVideoMode
のframeRate
プロパティです、それは変更可能です、そのVideoMode
に対する参照をもつこれら定数の値ではありません。
Identity Operators¶ 同一性演算子¶
Because classes are reference types, it’s possible for multiple constants and variables to refer to the same single instance of a class behind the scenes. (The same isn’t true for structures and enumerations, because they’re always copied when they’re assigned to a constant or variable, or passed to a function.) クラスが参照型であるので、複数の定数と変数があるクラスの同じ1つのインスタンスに言及することが舞台裏で可能です。(同じことは構造体と列挙にあてはまりません、なぜなら、それらが値型であって、それらが定数または変数に代入されるか関数に渡される時に、常にコピーされるからです)。
It can sometimes be useful to find out whether two constants or variables refer to exactly the same instance of a class. To enable this, Swift provides two identity operators: 2つの定数または変数が正確にあるクラスの同じインスタンスに言及するかどうかについて、探り出すことは時々役に立つことがあります。これを可能にするために、スウィフトは2つの同一性演算子を提供します:
- Identical to (
===
) 同一である(===
) - Not identical to (
!==
) 同一でない(!==
)
Use these operators to check whether two constants or variables refer to the same single instance: 2つの定数または変数が同じ1つのインスタンスに言及するかどうか調べるためにこれらの演算子を使用してください:
- if tenEighty === alsoTenEighty {
- print("tenEighty and alsoTenEighty refer to the same VideoMode instance.")
- }
- // Prints "tenEighty and alsoTenEighty refer to the same VideoMode instance."(「tenEightyとalsoTenEightyは、同じVideoModeインスタンスに言及します。」を出力します)
Note that identical to (represented by three equals signs, or ===
) doesn’t mean the same thing as equal to (represented by two equals signs, or ==
). Identical to means that two constants or variables of class type refer to exactly the same class instance. Equal to means that two instances are considered equal or equivalent in value, for some appropriate meaning of equal, as defined by the type’s designer.
同一である(3つの等号、つまり===
によって表されるもの)は同等である(2つの等号、つまり==
によって表されるもの)と同じことを意味しないのに注意してください。同一は、クラス型の2つの定数または変数が、正確に同じクラスインスタンスに言及することを意味します。同等は、2つのインスタンスが、値で「等しい」あるいは「相当する」と、ある適切な等しいの意味で、型の設計者によって定義されたとおりに、考慮されることを意味します。
When you define your own custom structures and classes, it’s your responsibility to decide what qualifies as two instances being equal. The process of defining your own implementations of the ==
and !=
operators is described in Equivalence Operators.
あなたが独自のあつらえのクラスと構造体を定義するとき、2つのインスタンスが等しくなる基準は何かを決めるのはあなたの責任です。==
および!=
演算子のあなた独自の実装を定義する過程は、等価演算子で記述されます。
Pointers¶ ポインター¶
If you have experience with C, C++, or Objective-C, you may know that these languages use pointers to refer to addresses in memory. A Swift constant or variable that refers to an instance of some reference type is similar to a pointer in C, but isn’t a direct pointer to an address in memory, and doesn’t require you to write an asterisk (*
) to indicate that you are creating a reference. Instead, these references are defined like any other constant or variable in Swift. The standard library provides pointer and buffer types that you can use if you need to interact with pointers directly—see Manual Memory Management.
あなたがC、C++、またはObjective-Cで経験を持つならば、あなたはこれらの言語がメモリのアドレスに言及するためにポインターを使用するということを知っているかもしれません。ある参照型のインスタンスに言及するスウィフト定数または変数はCの中のポインターに似ています、しかしメモリ中のアドレスへの直接のポインターでなくて、あなたに参照をつくっていることを示すために星印(*
)を書くことを要求しません。その代わりに、これらの参照は、スウィフトにおけるあらゆる他の定数または変数と同じように定義されます。標準ライブラリは、ポインタとバッファ型を提供します、それはあなたが直接にポインタと相互作用する必要があるならばあなたが使用できます — 手動メモリ管理を見てください。