2
1

More than 1 year has passed since last update.

上級者向け?便利なextension集①(swiftUI)

Posted at

こんにちは。フエルマネー開発者です。

今日は僕が実際に使っているextensionをまとめました。
たくさん書こうと思いましたが長くなりそうなのでシリーズ化して書きます。
まずは基本の型変換から!

extensionとは

すでに定義済みのクラスや構造体に対し、プロパティやメソッドを追加できるコードです。
例えばInt変数を倍にして返すtwiceプロパティを作ってみます。

拡張変数プロパティ

extension Int{
    var twice: Int{
        self * 2
    }
}

呼び出す時は以下のように記述します。

let num = 5
print(num.twice) // -> 10

メソッドで作っても構いません。同様の結果となります。

拡張メソッド

extension Int{
    func twice() -> Int{
        self * 2
    }
}

変数に関わらず、必ず同じ値を返す定数は以下のようにstaticを使います。

拡張定数

extension Int{
    static let million = 1_000_000
}

呼び出す時は以下のように記述します。

print(Int.million) // -> 1000000

便利な使い方①:型変換の高速化

頻繁に使う型をextensionしておけば、型変換を素早く記述できるようになります。

みなさんは、型変換するときに以下のような書き方をしていませんか?

let integer = 10 // Int型
let double = Double(integer) // Double型

もちろんこれが正規だと思いますが、大体let double = integerまで書いてから、「あ、これDouble型に変換しないと!」と気づくと思います。これを変換しようとすると、integerの左までカーソルを持って行ってからDouble(と書き、再びintegerの右へ移動し、)で閉じますよね。

僕が提示するソリューションは以下の通りです。

extension Int{
    var toDouble: Double{
        Double(self)
    }
}

上記のように拡張しておけば、以下のように型変換ができます。

let integer = 10 // Int型
let double = integer.toDouble // Double型

この場合、カーソルを移動する必要はありませんし、.を入力するだけでXcodeが予測してtoDoubleを提示してくれます。

カーソルを移動するのは正直、煩わしいんです。こんなことでと思うかもしれませんが、この作業の積み重ねが、コードを書く作業が増えていくと大きな効率の差になってきます。

やってみればわかりますが、これは開発体験、開発速度ともに大幅な向上が期待できます。

便利な使い方②:CoreDataのための型変換

やることは前項と一緒です。
普段swiftを書く分にはIntをよく使いますが、CoreDataを使っていると、Int16やInt64への変換を頻繁に行う必要が出てきます。

なのでとりあえず、以下の拡張をしましょう。

extension Int{
    var to16: Int16{
        Int16(self)
    }
    var to32: Int32{
        Int32(self)
    }
}

extension Int16{
    var toInt: Int{
        Int(self)
    }
}

extension Int32{
    var toInt: Int{
        Int(self)
    }
}

続いて、ユーザー定義の型やEnumへの変換です。
例えばフエルマネーでは、口座やカードなどの資産(負債)を以下の4タイプに分けています。

enum AccountType: Int16{
    case cash, bank, credit, prepaid

    var toString: String{
        ["現金", "銀行口座", "クレジット", "電子マネー"][self.rawValue.toInt]
    }
}

これらの分類情報をCoreDataに格納する際は、Int16に対応して格納します。
enumの定義時に、Int16にしてるのがミソです。

これで、enum→Int16への変換は.rawValueから呼び出せます。

let cash = AccountType.cash // AccountType型
print(cash.rawValue) // Int16型

では逆はどうするのか。正規のやり方は以下です。

let type: Int16 = 0 // Int16型
print(AccountType(rawValue: type)) // AccountType型

より一層、ボリューム感が出ましたね。
これも先ほどのやり方でextensionします。

extension Int16{
    var toAccountType: AccountType{
        AccountType(self)
    }
}

呼び出す時は以下。

let type: Int16 = 0 // Int16型
print(type.toAccountType) // AccountType型

一番の魅力は、Xcodeが勝手に候補を出してくれることです。
これで開発スピード爆上がり間違いなし!

ご覧いただきありがとうございました。
質問などあれば気軽にしてください。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1