【SwiftUI】UIColor（カラー）をextensionで一元管理して、SwiftUIで利用する

こんにちは、こばやしよしのり <a href="https://twitter.com/yoshiii514" target="_blank" rel="nofollow noopener noreferrer">@yoshiii514</a> です。

UIColorをextensionで管理したのちに、SwiftUIで利用する方法を解説します。

## UIColorをextentionで管理する手順

### 手順1:カラーの設定

まずは、プロジェクトを作成して、使用するカラーを登録します。
実際のアプリ開発では、背景・ボタン・テキストなどのカラーを直接にコードへ指定することはなくて、事前にカラー登録します。ライトモード、ダークモードにも対応できるので、カラーはAssets.xcassetsに登録して使うようにします。

<img src="https://ticklecode.com/wp/wp-content/uploads/2021/05/swiftuiuicolorextension1-800x422.png" alt="SwiftUIでUIColorをextensionにて一元管理する" width="800" height="422" class="alignnone size-large wp-image-6432" />

❶プロジェクトを作ります。今回は「UserColor」としました。
❷［Assets.xcassets］を選択します。
❸「＋」をクリックして、サブメニューから[Color Set]を選択します。
❹追加した[Color Set]の名前を「UserColor」に変更します。
❺［Any Appearance］（ライトモード時の色指定）、［Dark Appearance］（ダークモード時の色指定で好きな色を指定します。

### 手順2:登録したカラーをextensionでまとめる

extensionとは、<strong>拡張する</strong>という意味です。
クラス、構造体、列挙型に対して機能を拡張できます。拡張は追加するという意味合いです。

<img src="https://ticklecode.com/wp/wp-content/uploads/2021/05/swiftuiuicolorextension2_1-800x416.png" alt="【SwiftUI】UIColorをextensionで一元管理して、SwiftUIで利用する" width="800" height="416" class="alignnone size-large wp-image-6439" />

❶「UIColorExtention.swift」というSwiftファイルを作ります。
❷UIColor（カラーを管理するクラス）に、「UsedColor」というクラスプロパティを追加します。以下のコードを追加します。


```swift:
import UIKit
import Foundation

extension UIColor {
    class var UsedColor: UIColor {
        return UIColor(named: "UserColor")!
    }
}
```

これで、UIColorクラスには、UsedColorという新しいクラスプロパティが追加されました。

**クラスプロパティとは**
クラスに紐付くプロパティを、クラスプロパティといいます。
インスタンスが異なっても共通する値を保持したいときに使用します。
定義するには先頭にclassキーワードをつけます。

UsedColorプロパティでは、［Assets.xcassets］に登録した「UserColor」をUIColorデータ型で取得できます。
このように、extensionを使うことで、定義したカラーが一元管理できるようになります。

### 手順3:SwiftUIでextensionしたカラーを利用する

<img src="https://ticklecode.com/wp/wp-content/uploads/2021/05/swiftuiuicolorextension3-800x355.png" alt="【SwiftUI】UIColorをextensionで一元管理して、SwiftUIで利用する" width="800" height="355" class="alignnone size-large wp-image-6446" />

❶「ContentView.swift」を選択します。
❷bodyプロパティを以下のように修正します。

```swift:
var body: some View {
    ZStack {
        Color(UIColor.UsedColor)
        Text("Hello, world!")
            .padding()
    }
}
```

SwiftUIではColor構造体を使って色を指定します。
「Color(UIColor.UsedColor)」とすることで、UIColorインスタンスからカラーを生成します。

❸［Resume］ボタンをクリックしてプレビューを再描画します。画面背景が［Assets.xcassets］で指定した配色に変わっていることを確認してください。


## UIColorをextensionで管理するメリット

わざわざextensionを使って管理するメリットを考えたいと思います。

### メリット1.コード入力での入力ミス（不具合）をなくす

SwiftUIのColorは直接に［Assets.xcassets］で作ったカラーを指定することができます。

```swift:
// 直接にカラーを指定
Color("UserColor")
```

ただ、この場合は""（ダブルクォーテーション）で囲まれた部分は文字列となり、この文字列のチェックはXcodeではできません。（コンパイル時にチェックできない）
そのため、次のようなコードの入力ミスは事前にチェックすることができないです。

```swift:
Color("UserColr")
Color("UserColorr")
Color("usercolor")
```

「""」を利用したコードがたくさんあると、それだけで不具合のリスクが高くなります。
そのため、extensionで「""」を利用したコードを一元管理して、プロパティ化することで、入力ミスを防いでいます。

### メリット2.カラーの変更が用意にできる

カラーの変更をすることが多いですが、これもextensionを利用することで、簡単に変更することができます。

## 本記事で使用したプロジェクトファイル

👉 <a href="https://github.com/YoshinoriKobayashi/SwiftToolTrick/tree/main/UserColor" target="_blank" rel="nofollow noopener noreferrer">Xcodeプロジェクトファイルはこちらから閲覧できます。</a>

※本記事は、「<a href="https://ticklecode.com/swiftuiuicolorextension/" target="_blank" rel="noopener noreferrer">【SwiftUI】UIColor（カラー）をextensionで一元管理して、SwiftUIで利用する</a>」より転載しています。

## TickleCode LLC（ティクルコード）
<a href="https://ticklecode.com/" target="_blank" rel="noopener noreferrer"><img src="https://ticklecode.com/wp/wp-content/uploads/2016/06/logo_ticklecode.png" width="200"></a>
#### 🧑‍💻 私達は、iOS、Flutterでのアプリ開発に特化した企業です
予算に合わせて、月額契約や受託での開発が可能ですので、ぜひお仕事お待ちしております💪
#### 📗 出版実績
５年連続でアプリ開発の書籍を出版しています。
<a href="https://amzn.to/3vKsa61" target="_blank" rel="nofollow noopener noreferrer">たった2日でマスターできるiPhoneアプリ開発集中講座</a>