こんにちは。フエルマネー開発者です。
今日は僕が実際に使っている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が勝手に候補を出してくれることです。
これで開発スピード爆上がり間違いなし!
ご覧いただきありがとうございました。
質問などあれば気軽にしてください。