Swift

CGFloatをもっとシンプルに

More than 1 year has passed since last update.

役に立つかどうかよくわからないTipsシリーズ

swift は型に厳密ですけど

型推論でなんとなくいい感じにポコッと収まりますよね

let intVal = 0

こう書けば intVal は Int型になります

だけど、こう書くとどうでしょう

let width = 100.0

let height = 100.0
let frame = CGRectMake(0, 0, width, height)

とたんに怒られます

widthheight は、型推論で Float として扱われてしまうからです

CGFloat は CoreGraphic 系の中でも

座標指定したりする時に多用する型のひとつですが

こういうちょっとした融通の効かなさがありますね

で、普通なら

let width: CGFloat = 100.0

let height: CGFloat = 100.0
let frame = CGRectMake(0, 0, width, height)

こんな風に型を指定するか、もしくは

let width: 100.0

let height: 100.0
let frame = CGRectMake(0, 0, CGFloat(width), CGFloat(height))

こんな風にキャストして書きますね

長い、めんどくさい

そこで objective-c を思い出しました

CGFloat width = 100.0f;

CGFloat height = 100.0f;
CGRect frame = CGRectMake(0, 0, width, height);

objective-cは型宣言が必須なので、ソースコードの長さは変わらないけれど

語尾に f がつくことで、なんとなく型がわかる感じでした (← こんな書き方でいいのか?)

こんなノリを swift でも使いたい

そこで

extension Int {

public var f: CGFloat {
return CGFloat(self)
}
}
extension Float {
public var f: CGFloat {
return CGFloat(self)
}
}
extension Double {
public var f: CGFloat {
return CGFloat(self)
}
}

とりあえず、Int と Float と Double の extension を作って

fという計算プロパティをこしらえました

すると・・・

// Before

let width: CGFloat = 100.0
let height: CGFloat = 100.0
let frame = CGRectMake(0, 0, width, height)

// After
let width = 100.f
let height = 100.f
let frame = CGRectMake(0, 0, width, height)

なんということでしょう

非常にシンプルに CGFloat の変数を作ることができました

このサンプルだと恩恵がよくわかんないですけど

座標計算がかさばってくると、このプロパティは助かります

Int や Float がまぜこぜになると、非常にめんどくさい作業がありますからね

たとえば

let interval = 20.0

let viewCount = 4

let x = (view.frame.size.width + CGFloat(interval)) * CGFloat(viewCount)

みたいなのが

let interval = 20.0

let viewCount = 4

let x = (view.frame.size.width + interval.f) * viewCount.f

と、型が簡単に統一される上に、ソースが短くなります

CGFloat(数字)みたいにキャストを多用してる人は試してみては?