【Swift】基礎的な部分だけどしっかり覚えてないこと

## はじめに

大変お世話になっているこちらの本 [Swift実践入門 ── 直感的な文法と安全性を兼ね備えた言語](https://honto.jp/netstore/pd-book_30220833.html)を読み返す度に微妙に覚えきれていない（使えてない）ことに気づくので、一度まとめてみました。
ありがたいことに、[こちら](https://swift.codelly.dev/guide/swift%E3%81%A8%E3%81%AF/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9ESwift%E3%81%A8%E3%81%AF.html#swift%E3%81%A8%E3%81%AF)で本の内容（一部？）が公開してありました。

### アクセスコントロール

アクセスコントロールとは、モジュール内の型や型の要素に対する外部からのアクセスを制限する仕組みのこと。

アクセスコントロールを行うには、アクセスレベルを指定します。適切なアクセスレベルを指定することで、内部的な処理に外部からアクセスできないようにしつつ、モジュール外からの利用を想定したもののみを外部に公開できる。

#### アクセスレベル

アクセスレベルを指定することで、外部から個々の要素へアクセス可能な範囲を指定できる。

|アクセスレベル|公開範囲  |
|---|---|
|open|モジュール内外のすべてのアクセスを許可する|
|public|モジュール内外のすべてのアクセスを許可するが、モジュール外ではクラスを継承したりオーバーライドしたりすることはできない|
|internal|同一モジュール内のアクセスのみを許可する|
|fileprivate|同一ソースファイル内のアクセスのみを許可する|
|private|対象の要素が属しているスコープ内のアクセスのみを許可する|



#### デフォルトのアクセスレベル
型全体のアクセスレベルと、プロパティやメソッドなどの型を構成する要素のアクセスレベルは独立している。
それぞれにデフォルトのアクセスレベルが定められており、何も指定しなかった場合はデフォルトのアクセスレベルとなる。

型全体のデフォルトのアクセスレベルは、`internal`

型を構成する要素のデフォルトのアクセスレベルは、型全体のアクセスレベルによって異なる。
|型全体のアクセスレベル|型を構成する要素のデフォルトのアクセスレベル|
|---|---|
|open, public, internal|internal|
|private|private|
|fileprivate|fileprivate|


### キーワード

#### `final`
参照型(class)の継承を禁止できる。
class内のメソッドのオーバーライドについても`final`をつけることで禁止できる。

#### `mutating`
自身の値の変更を宣言するキーワード
値型(struct・enum)では、`mutating`キーワードをメソッドの宣言に追加することで、自身の値を変更する処理が実行できる。
ただし、`mutating`は再代入として扱われるので、`var`で宣言しておく必要がある。

```swift
struct HogeStrunct {
    var id: Int
    mutating func hogeMethod() {
        id = 5
    }
}

var a = HogeStrunct(id: 1)
a.hogeMethod()
a.id // 5
```

#### `lazy`
`var`の前に`lazy`をつけることで、アクセスされるまで初期化を遅延できる。
(再代入不可な`let`には使用できない。)
負荷の高いプロパティの初期化を遅らせて、パフォーマンスを上げたいときなどに使用。また、インスタンス化のあとに初期化されるので、初期化時に他のプロパティやメソッドを使うことができる。

- `lazy var インスタンスプロパティ名: プロパティの型 = 式`
- `static lazy var スタティックプロパティ名: プロパティの型 = 式`

### クラスプロパティ・クラスメソッド
#### クラスプロパティ
クラスのインスタンスではなく、クラス自身に紐付くプロパティで、インスタンスに依存しない値を扱う場合に利用する。スタティックプロパティとの違いは、スタティックプロパティがオーバーライドできないのに対して、クラスプロパティはオーバーライド可能なところ。

#### クラスメソッド
クラスのインスタンスではなく、クラス自身に紐付くメソッドで、インスタンスに依存しない値を扱う場合に利用する。スタティックメソッドとの違いは、スタティックメソッドがオーバーライドできないのに対して、クラスメソッドはオーバーライド可能なところ。

```swift
class hoge {
    class var hogeName: String { return "hogeName" }
    class func hogeMethod() -> String {
         return "hogeMethod"
    }

    static var baseHogeName: String { return "baseHogeName" }
    static func baseHogeMethod() -> String {
         return "baseHogeMethod"
    }
}

class foo: hoge {
    override class var hogeName: String { return "fooName" }
    override class func hogeMethod() -> String {
         return "fooMethod"
    }

    // ここでoverride static はできない
}
```

## おわりに
まだまだありますが、今回気になった（基礎的な部分）はこのあたりでした。
読んだ直後は完全に理解しているけど、少し経つとなんとなく分かるぐらいとなり、結果あまり使えていない状態に。
継続して読み返していこうと思います。


## 参照
[Swift実践入門 ── 直感的な文法と安全性を兼ね備えた言語](https://honto.jp/netstore/pd-book_30220833.html)

https://swift.codelly.dev/guide/%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%AB/#%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%83%AC%E3%83%99%E3%83%AB

https://swift.codelly.dev/guide/%E6%A7%8B%E9%80%A0%E4%BD%93%E3%81%A8%E3%82%AF%E3%83%A9%E3%82%B9/%E5%80%A4%E5%9E%8B%E3%81%A8%E5%8F%82%E7%85%A7%E5%9E%8B.html#mutating

https://swift.codelly.dev/guide/%E5%9E%8B%E3%81%AE%E6%A7%8B%E6%88%90/%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3.html#%E3%83%AC%E3%82%A4%E3%82%B8%E3%83%BC%E3%82%B9%E3%83%88%E3%82%A2%E3%83%89%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3-lazy-stored-properties

https://swift.codelly.dev/guide/%E6%A7%8B%E9%80%A0%E4%BD%93%E3%81%A8%E3%82%AF%E3%83%A9%E3%82%B9/%E3%82%AF%E3%83%A9%E3%82%B9.html#%E3%82%BF%E3%82%A4%E3%83%97%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3%E3%81%A8%E3%82%BF%E3%82%A4%E3%83%97%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%81%A8%E3%81%AE%E4%BD%BF%E3%81%84%E5%88%86%E3%81%91