LoginSignup
79
59

More than 5 years have passed since last update.

CGFloatをもっとシンプルに

Last updated at Posted at 2016-03-03

役に立つかどうかよくわからない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(数字)みたいにキャストを多用してる人は試してみては?

79
59
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
79
59