役に立つかどうかよくわからないTipsシリーズ
swift は型に厳密ですけど
型推論でなんとなくいい感じにポコッと収まりますよね
let intVal = 0
こう書けば intVal
は Int型になります
だけど、こう書くとどうでしょう
let width = 100.0
let height = 100.0
let frame = CGRectMake(0, 0, width, height)
とたんに怒られます
width
や height
は、型推論で 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(数字)
みたいにキャストを多用してる人は試してみては?