プロパティ


プロパティ は、特定のクラス、構造体、または列挙型と値を関連付けます。計算されたプロパティが (むしろ格納よりも) 値を計算するのに対して、格納されたプロパティは、インスタンスの一部として定数と変数の値を格納します。計算されたプロパティは、クラス、構造体、列挙型によって提供されます。格納されたプロパティはクラスおよび構造によってのみ提供されます。


格納され、計算されたプロパティは、通常、特定の型のインスタンスと関連付けられています。しかし、プロパティはまた、型自体に関連付けられることもできます。このようなプロパティは、型のプロパティとして知られています。


加えて、カスタム・アクションと共に応答できるプロパティの値の変化を監視するプロパティ・オブザーバーを定義できます。プロパティ・オブザーバーは、あなた自身が定義する格納されたプロパティに追加することができ、サブクラスがそのスーパークラスから継承するプロパティにも、追加できます。



格納されたプロパティ


その最も単純な形態では、格納されたプロパティは、特定のクラスまたは構造体のインスタンスの一部として格納されている定数または変数です。格納されたプロパティは、(var キーワードに引き続き定義された) 変数に格納されたプロパティ または (let キーワードに引き続き定義された) 定数に格納されたプロパティ のいずれかになります。


デフォルトのプロパティ値 で説明したように、その定義の一部として格納されたプロパティのデフォルト値を提供できます。また、初期化中に格納されたプロパティの初期値を設定し、変更できます。初期化中に定数プロパティんへの代入 で説明したように、これは定数に格納されたプロパティについても正しいです。


以下の例では、FixedLengthRange という構造体を定義し、一旦作成されたら変更できない範囲の長さの整数の範囲を記述しています。


  1. struct FixedLengthRange {
  2.        var firstValue: Int
  3.        let length: Int
  4. }
  5. var rangeOfThreeItems = FixedLengthRange(firstValue: 0, length: 3)
  6. // the range represents integer values 0, 1, and 2
  7. rangeOfThreeItems.firstValue = 6
  8. // the range now represents integer values 6, 7, and 8


FixedLengthRange のインスタンスには、firstValue という変数に格納されたプロパティと、length という定数に格納されたプロパティがあります。上記の例では、length は新しい範囲が作成された時に初期化され、その後、それが定数プロパティのため変更できません。


定数構造体インスタンスの格納されたプロパティ


構造体のインスタンスを作成し、定数にそのインスタンスを代入した場合、それらが変数プロパティとして宣言された場合でも、インスタンス・プロパティを変更することはできません。


  1. let rangeOfFourItems = FixedLengthRange(firstValue: 0, length: 4)
  2. // this range represents integer values 0, 1, 2, and 3
  3. rangeOfFourItems.firstValue = 6
  4. // this will report an error, even though firstValue is a variable property


rangeOfFourItems は (let キーワードを使った) 定数として宣言されているので、firstValue が変数プロパティであっても、その firstValue プロパティを変更することはできません。


この動作は、値型 である構造体に起因しています。値型のインスタンスが定数としてマークされると、すべてのプロパティがそのようになります。


同じことは 参照型 であるクラスの場合、正しくありません。参照型のインスタンスを定数に代入した場合、まだそのインスタンスの変数プロパティを変更することができます。


遅延した格納されたプロパティ


遅延した格納されたプロパティ は、初めて使用されるまではその初期値が計算されないプロパティです。その宣言の前に lazy の修飾子を書くことによって、遅延した格納されたプロパティを示して下さい。


注意: その初期値が、インスタンスの初期化が完了するまで検索されないので、常に、(var キーワードで) 変数として遅延したプロパティを宣言する必要があります。定数プロパティは、初期化が完了する 前に、必ず値を持たなければならず、そのため遅延した(lazy)として宣言することはできません。


プロパティの初期値が、インスタンスの初期化が完了するまで知られていない外部の要因に依存している場合、遅延したプロパティが便利です。プロパティの初期値が複雑で計算コストが高く、必要になるまで行われるべきではないセットアップを必要とする場合、遅延したプロパティは便利です。


以下の例は、複雑なクラスの不必要な初期化を避けるために、遅延した格納されたプロパティを使用しています。この例では、2つとも完全には示されていない DataImporterDataManager と言う2つのクラスを定義しています。


  1. class DataImporter {
  2.        /*
  3.        DataImporter is a class to import data from an external file.
  4.        The class is assumed to take a non-trivial amount of time to initialize.
  5.        */
  6.        var fileName = "data.txt"
  7.        // the DataImporter class would provide data importing functionality here
  8. }
  9. class DataManager {
  10.        lazy var importer = DataImporter()
  11.        var data = [String]()
  12.        // the DataManager class would provide data management functionality here
  13. }
  14. let manager = DataManager()
  15. manager.data.append("Some data")
  16. manager.data.append("Some more data")
  17. // the DataImporter instance for the importer property has not yet been created


DataManager クラスには、String 値の新しい、空の配列で初期化された data と言う格納されたプロパティがあります。その機能の残りの部分は示されていませんが、この DataManagaer クラスの目的は String データのこの配列へのアクセスを管理し、提供することにあります。


DataManager クラスの機能の一部は、ファイルからデータをインポートする機能です。この機能は、 DataImporter クラスによって提供され、初期化するためには少なくない時間が掛かると仮定されます。これは、 DataImporter インスタンスがファイルを開いて、DataImporter インスタンスが初期化されたときにその内容をメモリに読み込む必要があるからです。


DataManager インスタンスは、ファイルからデータをインポートすることが全くなく、そのデータを管理することが可能であるため、DataManager 自体が作成されても、新しいDataImporter インスタンスを作成する必要はありません。その代わりに、それを最初に使用する際 DataImporter インスタンスを作成するのが、より理にかなっています。


lazy 修飾子でマークされているため、importer プロパティが最初にアクセスされたときに、fileName プロパティが照会されたときのように、importer プロパティの DataImporter インスタンスはその時にのみ作成されます。


  1. print(manager.importer.fileName)
  2. // the DataImporter instance for the importer property has now been created
  3. // prints "data.txt"


注意: lazy 修飾子でマークされたプロパティに複数のスレッドが同時にアクセスし、そのプロパティがまだ初期化されていない場合、そのプロパティが一度しか初期化されないという保証はありません。


格納されたプロパティとインスタンス変数


Objective-C の経験がある場合は、それがクラスインスタンスの一部として値と参照を格納するために 2つ の方法を提供することを知っているかもしれません。プロパティに加えて、プロパティに格納された値の補助記憶としてインスタンス変数を使用できます。


Swift は、これらの概念を一つのプロパティ宣言に統合します。Swift のプロパティは、対応するインスタンス変数を持っておらず、プロパティの補助記憶には直接アクセスできません。このアプローチは、どう値が異なる文脈でアクセスされたかについての混乱を回避し、一つの、決定的な文にプロパティの宣言を簡素化します。プロパティに関するすべての情報は、その名前、型、およびメモリ管理特性を含め、型の定義の一部として一つの場所で定義されています。



計算されたプロパティ


格納されたプロパティ、クラス、構造体、および列挙型に加えて、実際には値を格納しない、計算されたプロパティ を定義できます。代わりに、それらは間接的に他のプロパティと値を取得し設定するためのゲッタと optional のセッタを提供します。


  1. struct Point {
  2.        var x = 0.0, y = 0.0
  3. }
  4. struct Size {
  5.        var width = 0.0, height = 0.0
  6. }
  7. struct Rect {
  8.        var origin = Point()
  9.        var size = Size()
  10.        var center: Point {
  11.                get {
  12.                        let centerX = origin.x + (size.width / 2)
  13.                        let centerY = origin.y + (size.height / 2)
  14.                        return Point(x: centerX, y: centerY)
  15.                }
  16.                set(newCenter) {
  17.                        origin.x = newCenter.x - (size.width / 2)
  18.                        origin.y = newCenter.y - (size.height / 2)
  19.                }
  20.        }
  21. }
  22. var square = Rect(origin: Point(x: 0.0, y: 0.0),
  23.        size: Size(width: 10.0, height: 10.0))
  24. let initialSquareCenter = square.center
  25. square.center = Point(x: 15.0, y: 15.0)
  26. print("square.origin is now at (\(square.origin.x), \(square.origin.y))")
  27. // prints "square.origin is now at (10.0, 10.0)"


この例では、幾何学的形状を操作するため3つの構造体を定義しています。


Rect 構造体はまた、center と言う計算されたプロパティも提供しています。Rect の現在の中心位置は、常にその originsize から決定できるので、明示的な Point 値として中心点を格納する必要はありません。その代わり、Rect は、それが本当の格納されたプロパティであるかのように長方形の center で作業できるよう、center と言う計算された変数のカスタムゲッタとセッタを定義します。


前述の例では、square と言う新しい Rect 変数を作成しています。square 変数は (0,0) の原点で初期化され、幅及び高さは 10 です。この正方形は、下の図の青い四角形で表されています。


square 変数の center プロパティは、現在のプロパティ値を取得するために、ドット構文 (square.center) を介してアクセスされ、center のゲッタの呼び出しを引き起こします。既存の値を返すよりもむしろ、ゲッタは、実際に計算し、正方形の中心を表すために新しい Point を返します。上記から分かるように、ゲッタは正しく (5,5) の中心点を返します。


center プロパティは、下の図ではオレンジ色の正方形で示される新しい位置に、正方形を上、右にに移動する、(15、15) の新しい値に設定されています。center プロパティを設定すると、格納された origin プロパティの xy の値を変更する center 用セッタを呼び出し、その新しい位置に正方形を移動します。



computedProperties_2x


セッタ宣言の省略形


計算されたプロパティのセッタが設定すべき新しい値の名前を定義していなければ、デフォルトの名前である newValue が使用されます。ここで、この省略形の表記法を利用している、Rect 構造体の別バージョンを示します:


  1. struct AlternativeRect {
  2.        var origin = Point()
  3.        var size = Size()
  4.        var center: Point {
  5.                get {
  6.                        let centerX = origin.x + (size.width / 2)
  7.                        let centerY = origin.y + (size.height / 2)
  8.                        return Point(x: centerX, y: centerY)
  9.                }
  10.                set {
  11.                        origin.x = newValue.x - (size.width / 2)
  12.                        origin.y = newValue.y - (size.height / 2)
  13.                }
  14.        }
  15. }


読み取り専用の計算されたプロパティ


ゲッタと計算されたプロパティがあり、セッタがないのは 読み取り専用の計算されたプロパティ として知られています。読み取り専用の計算されたプロパティは常に値を返し、ドット構文を使用してアクセスできますが、別の値に設定することはできません。


注意: それらの値が固定されていないので、計算されたプロパティを、読み取り専用の計算されたプロパティも含め、var キーワードで変数プロパティとして宣言しなければなりません。let キーワードは、インスタンスの初期化の一部として、一度設定されるとその値を変更できないことを示すために、定数のプロパティのためにのみ使用されます。


get キーワードと括弧を除くと、読み取り専用の計算されたプロパティの宣言を単純化できます。


  1. struct Cuboid {
  2.        var width = 0.0, height = 0.0, depth = 0.0
  3.        var volume: Double {
  4.                return width * height * depth
  5.        }
  6. }
  7. let fourByFiveByTwo = Cuboid(width: 4.0, height: 5.0, depth: 2.0)
  8. print("the volume of fourByFiveByTwo is \(fourByFiveByTwo.volume)")
  9. // prints "the volume of fourByFiveByTwo is 40.0"


この例では、widthheight、そして depth プロパティがある三次元の長方形の箱を表す Cuboid と言う新しい構造体を定義しています。この構造体にはまた、volume と言う読み取り専用の計算されたプロパティもあり、立方体の現在の体積を計算して返します。これは、widthheight そして depth のどの値が、特定の volume の値に使用されるかに関してあいまいなので、 volume が設定可能である事を意味しません。それにも関わらず、Cuboid が現在の計算された体積を外部ユーザーが発見するのを有効にするために読み取り専用の計算されたプロパティを提供するのは、便利です。



プロパティ監視者


プロパティの監視者 は、プロパティの値の変化を監視し、対応します。プロパティの監視者は、新しい値がプロパティの現在の値と同じであっても、プロパティの値が設定されるたびに呼びだされます。


遅延した格納されたプロパティを除いて、全ての定義した格納されたプロパティにプロパティの監視者を追加できます。また、サブクラス内のプロパティをオーバーライドすることで、全ての継承された (格納または計算された) プロパティにプロパティの監視者を追加する事もできます。監視し、計算されたプロパティのセッターの値での変化に対応することができるので、オーバーライドしない計算されたプロパティのプロパティ監視者を定義する必要はありません。プロパティのオーバーライドは、オーバーライド(上書き) で説明しています。



プロパティ上のこれらの監視者のいずれかまたは両方を定義するオプションがあります:


willSet 監視者を実装する場合、それには定数パラメータとして新しいプロパティ値が渡されます。willSet の実装の一部として、このパラメータの名前を指定できます。実装内でパラメータ名と括弧を書かない場合、パラメータは newValue のデフォルトのパラメータ名で利用できるようになります。


同様に、didSet 監視者を実装した場合、それには古いプロパティ値を含む定数パラメータが渡されます。パラメータに名前を付けるか、またはは oldValue のデフォルトのパラメータ名を使用できます。独自の didSet 監視者内のプロパティに値を割り当てる場合は、割り当てた新しい値は、ちょうど設定されたものを置き換えます。


注意: プロパティがサブクラス内のイニシャライザで設定されている時、スーパークラスのイニシャライザが呼び出された後、スーパークラスのプロパティの willSetdidSet 監視者プロパティが、呼び出されます。スーパークラスのイニシャライザが呼び出される前に、クラスが独自のプロパティを設定している間、彼らは呼び出されません。

イニシャライザのデリゲートの詳細については、値型のイニシャライザデリゲート と、クラス型のイニシャライザデリゲート を参照してください。


ここでアクションの willSetdidSet の例を挙げます。以下の例では、歩きながら人が歩くステップの総数を追跡する StepCounter と言う新しいクラスを定義しています。このクラスは、彼らの日常生活の間に、人の運動を追跡するために、歩数計またはその他の歩数カウンターからの入力データを使用するかもしれません。


  1. class StepCounter {
  2.        var totalSteps: Int = 0 {
  3.                willSet(newTotalSteps) {
  4.                        print("About to set totalSteps to \(newTotalSteps)")
  5.                }
  6.                didSet {
  7.                        if totalSteps > oldValue {
  8.                        print("Added \(totalSteps - oldValue) steps")
  9.                        }
  10.                }
  11.        }
  12. }
  13. let stepCounter = StepCounter()
  14. stepCounter.totalSteps = 200
  15. // About to set totalSteps to 200
  16. // Added 200 steps
  17. stepCounter.totalSteps = 360
  18. // About to set totalSteps to 360
  19. // Added 160 steps
  20. stepCounter.totalSteps = 896
  21. // About to set totalSteps to 896
  22. // Added 536 steps


StepCounter クラスは、Int 型の totalSteps プロパティを宣言します。これは willSetdidSet 監視者のある格納されたプロパティです。


プロパティが新しい値を代入された時はいつでも totalStepswillSetdidSet 監視者が呼び出されます。これは、新しい値が現在の値と同じ場合でも同様です。


この例の willSet 監視者は、今後の新しい値のために newTotalSteps と言うカスタムパラメータ名を使用します。この例では、単に設定しようとする値を印刷します。


totalSteps の値が更新された後 didSet 監視者は呼び出されます。それは、古い値に対して totalSteps の新しい値を比較します。総ステップ数が増加していた場合、どれだけ多く新たなステップが踏まれたかを示すためにメッセージが印刷されます。didSet 監視者は、古い値にカスタムパラメータ名を提供しておらず、代わりに oldValue のデフォルト名が使用されます。


注意: in-out パラメータとして関数に監視者を持つプロパティを渡すと、willSetdidSet 監視者が常に呼び出されます。これは、 in-out パラメータの copy-in copy-out メモリモデルのためです。値は常に関数の最後にプロパティに書き戻されます。in-out パラメータの動作についての詳細は、In-Out パラメータ を参照してください。


グローバルとローカル変数


計算する、監視するプロパティの、上記の機能はまた グローバル変数ローカル変数 にも利用可能です。グローバル変数は全ての関数、メソッド、クロージャ、または型のコンテキストの外で定義されている変数です。ローカル変数は、関数、メソッド、またはクロージャのコンテキスト内で定義されている変数です。


以前の章で遭遇したグローバルとローカル変数は、すべて 格納された変数 です。格納された変数は、格納されたプロパティと同様に、特定の型の値の記憶域を提供し、その値を設定し、取得することを可能にします。


ただし、計算された変数 を定義することもできますし、グローバルまたはローカルの範囲で、格納された変数の監視者も定義できます。計算された変数は、値を格納するよりも計算し、計算されたプロパティと同じように書かれます。


注意: グローバル定数と変数は常に 遅延した格納されたプロパティ と同様に、遅れて計算されます。遅延した格納されたプロパティとは異なり、グローバル定数と変数は lazy 修飾子でマークする必要はありません。

ローカル定数や変数は遅れて計算されることは決してありません。


型プロパティ


インスタンス・プロパティは、特定の型のインスタンスに属しているプロパティです。その型の新しいインスタンスを作成するたびに、それは他のインスタンスとは別のプロパティ値の独自のセットを持っています。


また、その型のいずれのインスタンスでもない、型自体に属しているプロパティを定義することもできます。その型のインスタンスをどれだけ多く作成したかに関係なく、これらのプロパティのいずれか一つのコピーしかありません。これらの種類のプロパティは、型プロパティ と呼ばれます。


型プロパティは、特定の型の すべての インスタンスへの普遍的な値を定義し、すべてのインスタンスが (C の静的定数のように) 使える定数プロパティのように、またはその型の全てのインスタンスに対するグローバルな値を格納する (C の静的変数のように) 変数プロパティとして、有用です。


格納された型プロパティは、変数や定数にすることができます。計算された型プロパティは常に計算されたインスタンスのプロパティと同じように、変数プロパティとして宣言されます。



注意: 格納されたインスタンスプロパティとは異なり、格納された型プロパティには常にデフォルト値を与えなければなりません。これは、型自体は、初期化される時には格納された型プロパティに値を代入することができるイニシャライザを持っていないためです。
格納された型プロパティはその最初のアクセスで遅れて初期化されます。これらは、同時に複数のスレッドによってアクセスされる場合であっても、一度だけ初期化されることが保証されており、それらは lazy 修飾子でマークする必要はありません。


型プロパティの構文


C と Objective-C では、グローバル 静的変数として型に関連付けられた静的定数と変数を定義できます。Swift では、しかし、型プロパティは、型の外の中括弧の中に、型の定義の一部として書かれ、各々の型プロパティはサポートしている型に明示的にスコープされます。


static キーワードで型プロパティを定義して下さい。クラス型の計算された型プロパティでは、スーパークラスの実装をサブクラスがオーバーライド(上書き)するのを許す代わりに class キーワードを使用できます。以下の例で、格納されたプロパティと、計算された型プロパティの構文を示します。


  1. struct SomeStructure {
  2.         static var storedTypeProperty = "Some value."
  3.         static var computedTypeProperty: Int {
  4.                 return 1
  5.         }
  6. }
  7. enum SomeEnumeration {
  8.         static var storedTypeProperty = "Some value."
  9.         static var computedTypeProperty: Int {
  10.                 return 6
  11.         }
  12. }
  13. class SomeClass {
  14.         static var storedTypeProperty = "Some value."
  15.         static var computedTypeProperty: Int {
  16.                 return 27
  17.         }
  18.         class var computedTypeProperty: Int {
  19.                 return 107
  20.         }
  21. }


注意: 上記の計算された型プロパティの例では、読み取り専用の計算された型プロパティですが、計算されたインスタンス・プロパティと同じ構文で、読み・書きのできる、計算された型プロパティも定義できます。


型プロパティの照会と設定


型プロパティは、ちょうどインスタンス・プロパティのように、ドット構文で照会、設定されます。しかし、型プロパティはその型のインスタンスではなく、 により照会、設定されます。例えば:


  1. print(SomeClass.computedTypeProperty)
  2. // prints "Some value"
  3. SomeStructure.storedTypeProperty = "Another value."
  4. print(SomeStructure.storedTypeProperty)
  5. // prints "Another value."
  6. print(SomeEnumeration.computedTypeProperty)
  7. // Prints "6"
  8. print(SomeClass.computedTypeProperty)
  9. // prints "27"


以下の例は、オーディオチャンネル数のオーディオレベルメーターのあるモデルの構造体の一部として格納された2つの型プロパティを使用しています。各チャンネルには、0 から 10 までの整数のオーディオレベルがあります。


下の図は、これらの2つのオーディオチャンネルが、ステレオオーディオ・レベルメーターをモデル化して組み合わせている所を示しています。チャンネルのオーディオレベルが 0 の場合、そのチャンネルの光はいずれも点灯していません。オーディオレベルが 10 の場合、そのチャンネルの光は全て点灯しています。この図では、左チャンネルは現在 9 のレベルであり、右チャンネルは現在 7 のレベルです。


staticPropertiesVUMeter_2x


上述のオーディオチャンネルを AudioChannel 構造体のインスタンスによって表わします。


  1. struct AudioChannel {
  2. static let thresholdLevel = 10
  3. static var maxInputLevelForAllChannels = 0
  4. var currentLevel: Int = 0 {
  5.         didSet {
  6.                 if currentLevel > AudioChannel.thresholdLevel {
  7.                 // cap the new audio level to the threshold level
  8.                 currentLevel = AudioChannel.thresholdLevel
  9.                 }
  10.                 if currentLevel > AudioChannel.maxInputLevelForAllChannels {
  11.                 // store this as the new overall maximum input level
  12.                 AudioChannel.maxInputLevelForAllChannels = currentLevel
  13.                 }
  14.             }
  15.         }
  16. }


AudioChannel 構造体は、その機能をサポートするために、2つの格納された型プロパティを定義しています。まず、thresholdLevel は、オーディオレベルが取りうる最大の閾値を定義しています。これは、すべての AudioChannel インスタンスに対する 10 の定数値です。オーディオ信号が 10 よりも高い値になる場合には、この閾値にフタをされます (後述)。


第二の型プロパティは、maxInputLevelForAllChannels という変数に格納されたプロパティです。これは、全てAudioChannel インスタンスによって受信された最大入力値を追跡します。これは、初期値 0 で始まります。


AudioChannel 構造体は、0 から 10 のスケールでチャンネルの現在のオーディオレベルを表す currentLevel という、格納されたインスタンスプロパティも定義しています。


currentLevel プロパティには、それが設定されるたびに currentLevel の値を確認する didSet プロパティの監視者があります。この監視者は2つの確認を実行します。


注意: これら二つのチェックのうち最初の項目は、didSet 監視者は currentLevel に違う値を設定します。しかしこれで、監視者が再び呼び出されることはありません。


ステレオサウンドシステムのオーディオレベルを表すために、leftChannelrightChannel という二つの新しいオーディオチャンネルを作成するために AudioChannel 構造体を使用します。


  1. var leftChannel = AudioChannel()
  2. var rightChannel = AudioChannel()


チャンネルの currentLevel7 に設定すると、maxInputLevelForAllChannels の型プロパティが 7 に等しく更新されていることがわかるでしょう。


  1. leftChannel.currentLevel = 7
  2. print(leftChannel.currentLevel)
  3. // prints "7"
  4. print(AudioChannel.maxInputLevelForAllChannels)
  5. // prints "7"


チャンネルの currentLevel11 を設定しようとすると、右チャンネルの currentLevel プロパティが 10 の最大値でフタをし、maxInputLevelForAllChannels 型プロパティは、10 に等しく更新されます。


  1. rightChannel.currentLevel = 11
  2. print(rightChannel.currentLevel)
  3. // prints "10"
  4. print(AudioChannel.maxInputLevelForAllChannels)
  5. // prints "10"




前:クラスと構造体 次:メソッド
目次
Xcode 9 の新機能

Swift:はじめに
Swift と Cocoa と Objective-C
Swift Blog より

  • ようこそ Swift へ(Part I)
  • Swift について
  • バージョン互換性
  • Swift のツアー
  • 単純な値
    制御フロー
    関数とクロージャ
    オブジェクトとクラス
    列挙型と構造体
    プロトコルと拡張機能
    エラー処理
    汎用(ジェネリック)
  • Swift 言語のガイド(Part II)
  • Swift の基本
  • 定数と変数
  • 定数と変数の宣言
    型注釈
    定数と変数の命名
    定数と変数の印刷
    コメント
    セミコロン
  • 整数
  • 整数の境界
    Int
    UInt
    浮動小数点数
    安全な型と型推論
    数値リテラル
  • 数値型変換
  • 整数変換
    整数と浮動小数点間の変換
    型エイリアス
    ブール型
    タプル
  • Optional
  • nil
    if 文と強制開封
    Optional の結合
    暗黙に開封された Optionals
    エラー処理
  • アサーション(断言)と前提条件
  • アサーションを使用したデバッグ
    前提条件の実施
  • 基本演算子
  • 専門用語
    代入演算子
  • 算術演算子
  • 剰余演算子
    単項マイナス演算子
    単項プラス演算子
    複合代入演算子
    比較演算子
    三項条件演算子
    Nil 合体演算子
  • 範囲演算子
  • 閉鎖範囲演算子
    半開放範囲演算子
    片方の範囲
  • 論理演算子
  • 論理 NOT 演算子
    論理 AND 演算子
    論理 OR 演算子
    論理演算子の組み合わせ
    明示的な括弧
  • 文字列と文字
  • 文字列リテラル
    複数行の文字列リテラル
    文字列リテラル内の特殊文字
    空の文字列の初期化
    文字列の可変性
    文字列は値の型
    文字を使った作業
    文字列と文字を連結
    文字列補間
  • ユニコード(Unicode)
  • Unicode スカラー
    文字列リテラルの中の特別の文字
    拡張書記クラスタ
    文字を数える
  • 文字列のアクセスと変更
  • 文字列のインデックス
    部分文字列
    挿入と削除
  • 文字列の比較
  • 文字列と文字の等価性
    接頭辞と接尾辞の等価性
  • 文字列の Unicode 表現
  • UTF-8 の表現
    UTF-16 表現
    Unicode のスカラー表現
  • コレクション型
  • コレクションの可変性
  • 配列
  • 配列型省略構文
    空の配列の作成
    デフォルト値を持つ配列の作成
    2つの配列を共にして一つの配列に
    配列リテラルでの配列の作成
    配列へのアクセスと変更
    配列の繰り返し処理
  • セット
  • セット型のハッシュ値
    セット型の構文
    空のセットの作成と初期化
    配列リテラルでセットの作成
    セットへのアクセスと変更
    セットを反復処理
  • セット操作の実行
  • 基本的なセットの操作
    セットの身分と等価性
  • Dictionary
  • Dictionary 型の省略型構文
    空の Dictionary を作成
    Dictionary リテラルで Dictionary の作成
    Dictionary のアクセスと変更
    Dictionary を繰り返し処理
  • フロー制御
  • For-In ループ
  • While ループ
  • While
    Repeat-While
  • 条件文
  • if 文
  • Switch
  • 暗黙の Fallthrough なし
    範囲の一致
    タプル(Tuples)
    値の結合
    Where
    複合した case
  • 制御転送文
  • Continue
  • Break
  • ループ文内の Break
    Switch 文内の Break
    Fallthrough
    ラベル付きの文
    早期終了
    API 利用可能性の確認
  • 関数
  • 関数の定義と呼び出し
  • 関数のパラメータと戻り値
  • パラメータなしの関数
    複数パラメータの関数
    戻り値なしの関数
    複数の戻り値を持つ関数
    optional のタプル型の戻り値
  • 関数引数のラベルとパラメータ名
  • 引数のラベルの指定
    引数ラベルの省略
    デフォルトのパラメータ値
    可変個引数のパラメータ
    In-Out パラメータ
  • 関数型
  • 関数型の使用
    パラメータ型としての関数型
    戻り値の型としての関数型
    入れ子になった関数
  • クロージャ
  • クロージャ式
  • ソートするメソッド
    クロージャ式の構文
    文脈から型を推論
    単一式クロージャからの暗黙的戻り値
    引数名の省略
    演算子メソッド
    後続クロージャ
    値のキャプチャ
    クロージャは参照型
    クロージャのエスケープ
    オートクロージャ
  • 列挙型
  • 列挙型の構文
    switch 文で列挙型の値の一致
    関連する値
  • 生の値
  • 暗黙に割り当てられた生の値
    生の値からの初期化
    再帰的な列挙型
  • クラスと構造体
  • クラスと構造体を比較
  • 定義の構文
    クラスと構造体のインスタンス
    プロパティにアクセス
    構造体型のためのメンバー化イニシャライザ
    構造体と列挙型は値型
  • クラスは参照型
  • ID 演算子
    ポインタ
    クラスと構造体の間の選択
    文字列、配列、辞書の代入とコピーの動作
  • プロパティ
  • 格納されたプロパティ
  • 定数構造体インスタンスの格納されたプロパティ
    遅延した格納されたプロパティ
    格納されたプロパティとインスタンス変数
  • 計算されたプロパティ
  • セッタ宣言の省略形
    読み取り専用の計算されたプロパティ
    プロパティ監視者
    グローバルとローカル変数
  • 型プロパティ
  • 型プロパティの構文
    型プロパティの照会と設定
  • メソッド
  • インスタンスメソッド
  • self プロパティ
    インスタンスメソッド内から値の型を変更
    変異メソッド内で self に代入
    型メソッド
  • サブスクリプト
  • サブスクリプトの構文
    サブスクリプトの使用法
    サブスクリプトのオプション
  • 継承
  • 基本クラスの定義
    サブクラス化
  • オーバーライド(上書き)
  • スーパークラスメソッド、プロパティ、サブスクリプトへのアクセス
    オーバーライドするメソッド
  • オーバーライドするプロパティ
  • プロパティのゲッタとセッタのオーバーライド
    プロパティ監視者のオーバーライド
    オーバーライドの防止
  • 初期化
  • 格納されたプロパティの初期値を設定
  • イニシャライザ
    デフォルトのプロパティ値
  • 初期化のカスタマイズ
  • 初期化パラメータ
    パラメータ名と引数ラベル
    引数ラベルのないイニシャライザのパラメータ
    Optional のプロパティ型
    初期化中に定数プロパティへの代入
  • デフォルトのイニシャライザ
  • 構造体型のためのメンバ化イニシャライザ
    値型のイニシャライザデリゲート
  • クラスの継承と初期化
  • 指定イニシャライザとコンビニエンスイニシャライザ
    指定とコンビニエンスイニシャライザの構文
    クラス型のイニシャライザデリゲート
    二相の初期化
    イニシャライザ継承とオーバーライド
    自動イニシャライザの継承
    実際の指定とコンビニエンスイニシャライザ
  • 失敗可能イニシャライザ
  • 生の値を持つ列挙型のための失敗可能イニシャライザ
    初期化失敗の伝播
    失敗可能イニシャライザのオーバーライド
    init! の失敗可能イニシャライザ
    必須イニシャライザ
    クロージャや関数でのデフォルトのプロパティ値設定
  • デイニシャライザ
  • デイニシャライザはどのように働くか
    作動中のデイニシャライザ
  • Optional の連鎖
  • 強制開封の代替としての Optional の連鎖
    Optional の連鎖のモデルクラスの定義
    Optional の連鎖を使用したプロパティへのアクセス
    Optional の連鎖を通じてメソッドを呼び出す
  • Optional の連鎖を通じてサブスクリプトへのアクセス
  • Optional 型のサブスクリプトにアクセス
    連鎖の複数レベルのリンク
    optional の戻り値を持つメソッドでの連鎖
  • エラー処理
  • エラーの表現と Throw
    エラーの処理
    throw 関数を使用したエラーの伝播
    Do-Catch を使用したエラー処理
    エラー をOptional の値に変換
    エラー伝播を無効に
    クリーンアップアクションの指定
  • 型キャスト
  • 型キャストのためのクラス階層の定義
    型のチェック
    ダウンキャスト
  • Any と AnyObjecgt 用の型キャスティング
  • ネストした型
  • 実際のネストした型
    ネストした型への参照
  • 拡張機能
  • 拡張機能の構文
    計算されたプロパティ
    イニシャライザ
  • メソッド
  • 変異インスタンスメソッド
    サブスクリプト
    ネストした型
  • プロトコル
  • プロトコルの構文
    プロパティの要件
    メソッドの要件
    変異メソッドの要件
  • イニシャライザの要件
  • プロトコルイニシャライザ要件のクラス実装
    失敗可能イニシャライザの要件
    型としてのプロトコル
    デリゲート
  • 拡張機能を持つプロトコル準拠の追加
  • 拡張機能を持つプロトコルの採用を宣言
    プロトコル型のコレクション
    プロトコルの継承
    クラス専用プロトコル
    プロトコルの構成
    プロトコル準拠の確認
    Optional のプロトコル要件
  • プロトコル拡張機能
  • デフォルトの実装の提供
    プロトコル拡張機能に制約を追加
  • ジェネリック(汎用)
  • 汎用が解決する問題
    汎用関数
    型パラメータ
    型パラメータの命名
    汎用の型
    汎用型の拡張
  • 型の制約
  • 型制約の構文
    実際の型の制約
  • 関連型
  • 実際の関連型
    既存の型を拡張して関連型を指定
    型注釈を使用して関連型を制約
    汎用の Where 句
    汎用の Where 句を含む拡張機能
    関連する型と汎用の Where 句
    汎用のサブスクリプト
  • 自動参照カウント
  • どのように ARC は働くか
    実際の ARC
    クラスインスタンス間の強い循環参照
  • クラスインスタンス間の強い循環参照の解決
  • 弱い参照
    所有されていない参照
    所有されていない参照と暗黙に開封された Optional のプロパティ
    クロージャの strong な循環参照
  • クロージャの strong な循環参照の解決
  • キャプチャリストの定義
    弱い参照と所有されていない参照
  • メモリの安全性
  • メモリへのアクセス競合の理解
    メモリアクセスの特徴
    In-Out パラメータへのアクセスの競合
    メソッド内の Self へのアクセスの競合
    プロパティへのアクセスの競合
  • アクセス制御
  • モジュールとソースファイル
  • アクセスレベル
  • アクセスレベルの全体的指針
    デフォルトのアクセスレベル
    ターゲット一つのアプリのアクセスレベル
    フレームワークのアクセスレベル
    ユニットテストのターゲット用のアクセスレベル
    アクセス制御の構文
  • カスタム型
  • タプル型
    関数型
  • 列挙型
  • 生の値と関連する値
    ネストした型
    サブクラス化
  • 定数、変数、プロパティ、およびサブスクリプト
  • ゲッタとセッタ
  • イニシャライザ
  • デフォルトのイニシャライザ
    構造体型用のデフォルトメンバ化イニシャライザ
  • プロトコル
  • プロトコルの継承
    プロトコルの準拠
  • 拡張機能
  • 拡張機能の private メンバ
    汎用
    型エイリアス
  • 高度な演算子
  • ビット単位演算子
  • ビット単位の NOT 演算子
    ビット単位の AND 演算子
    ビット単位の OR 演算子
    ビット単位の XOR 演算子
  • ビット単位の左と右シフト演算子
  • 符号なし整数のシフト動作
    符号付き整数のシフト動作
  • オーバーフロー演算子
  • 値オーバーフロー
    優先順位と結合性
  • 演算子メソッド
  • 接頭辞と接尾辞演算子
    複合代入演算子
    等価演算子
  • カスタム演算子
  • カスタム挿入辞演算子の優先順位
  • 言語のガイド(Part III)
  • 言語リファレンスについて
  • 文法の読み方
  • 語彙の構造
  • 空白とコメント
    識別子
    キーワードと句読点
  • リテラル
  • 整数リテラル
    浮動小数点リテラル
    文字列のリテラル
    演算子

  • 型注釈
    型識別子
    タプル型
    関数型
    エスケープしないクロージャの制限事項
    配列型
    辞書型
    Optional の型
    暗黙に開封された Optional の型
    プロトコル構成の型
    メタタイプ型
    型の継承句
    型の推測

  • 接頭辞式
    Try 演算子
  • 二項式
  • 代入演算子
    三項条件演算子
    型キャスト演算子
  • 一次式
  • リテラル式
    Self 式
    スーパークラス式
  • クロージャ式
  • キャプチャ・リスト
    暗黙のメンバ式
    括弧で囲まれた式
    タプル式
    ワイルドカード式
    キーパス式
    セレクタ式
    キーパス文字列式
  • 接尾辞の式
  • 関数呼び出し式
    イニシャライザ式
    明示的なメンバ式
    接尾辞の Self 式
    サブスクリプト 式
    強制値の式
    Optional の連鎖式

  • ループ文
  • For-In 文
    While 文
    Repeat-While 文
  • 分岐文
  • if 文
    Guard 文
  • switch 文
  • switch 文は、網羅的である必要あり
    実行が暗黙的に case を Fall Through しない
    ラベル付き文
  • 制御転送文
  • break 文
    continue 文
    fallthrough 文
    return 文
    throw 文
    defer 文
    do 文
  • コンパイラ制御文
  • 条件コンパイルブロック
    行制御文
    利用可能条件
  • 宣言
  • トップレベルのコード
    コードブロック
    Import 宣言
    ­定数の宣言
  • 変数の宣言
  • 格納された変数と格納された変数のプロパティ
    計算された変数と計算されたプロパティ
    格納された変数監視者とプロパティの監視者
    型変数プロパティ
    型エイリアス宣言
  • 関数の宣言
  • パラメータ名
    In-Out パラメータ
    パラメータの特殊な種類
    メソッドの特殊な種類
    Throw する関数とメソッド
    Rethrow する関数とメソッド
    決して返さない関数
  • 列挙型の宣言
  • 任意の型の case を列挙
  • 間接による列挙
    生の値型の case を列挙
    列挙型 case へのアクセス
    構造体の宣言
    クラスの宣言
  • プロトコルの宣言
  • プロトコル・プロパティ宣言
    プロトコル・メソッド宣言
    プロトコル・イニシャライザ宣言
    プロトコル・サブスクリプト宣言
    プロトコルに関連した型の宣言
  • イニシャライザ宣言
  • 失敗可能イニシャライザ
    デイニシャライザ宣言
    拡張機能の宣言
    サブスクリプト宣言
    演算子の宣言
    優先順位グループ宣言
  • 宣言修飾子
  • アクセス制御レベル
  • 属性
  • 宣言の属性
  • インターフェイスビルダーで使われる宣言属性
    型の属性
  • パターン
  • ワイルドカードパターン
    識別子パターン
    値結合パターン
    タプルパターン
    列挙型 case パターン
    Optional のパターン
    型キャストパターン
    式のパターン
  • 汎用パラメータと引数
  • 汎用パラメータ句
  • 汎用の where 句
    汎用引数句
  • 文法のまとめ
  • 語彙の構造



    宣言
    属性
    パターン
    汎用パラメータと引数
  • マニュアルの変更履歴
  • 変更履歴












    トップへ(Swift Language Basics)












    トップへ(Swift Language Basics)












    トップへ(Swift Language Basics)