Swift では、Double に %(剰余計算) が使えなくなっていました。代替の方法を説明します。
整数値で揃えたい時もそうですが、Doubleの数列を使っていると、0.5刻みで揃えたいとかあります。
データがあって、そのデータを表示するための表示域を決めるときがその1つです。
たとえば、、0.3, 0.4, 0.7, 0.9, 1.3 というようなデータを表示するときに、[0.0,1.5]を表示値域としたい というようなケースです。
Sponsor Link
0.5刻みで数値を含む範囲を計算する
ちょっとごちゃごちゃしてますが、剰余計算を自前でしているだけです。
let minValue = ... Let maxValue = ... let axisMinValue = Double(Int(minValue/0.5))*0.5 - 0.5 let axisMaxValue = Double(Int(maxValue/0.5))*0.5 + 1.0
0.5 での剰余計算をして、切り捨てているため、境界上にデータがあると、グラフとしては見づらくなってしまうために、表示域を -0.5, +1.5 しています。
厳密に範囲を調整したい時は、ちょうど割り切れたかどうかの判定を加える必要があります。(ただ、Double の数値では、ちょうど割り切れるの定義が必要ですよね)
extensionにしておくと便利
以下のようなextensionにしてたまに使ってます。
extension Double { func align(step: Double) -> Double { return Double(Int(self/step))*step } }
代替メソッドも用意されてました
普通に調べれば載ってます・・・
truncatingRemainder
func truncatingRemainder(dividingBy other: Double) -> Double
Apple のドキュメントは、こちら。
似たメソッドもあります
少し動作のことなるメソッドも作られてました。
remainder
func remainder(dividingBy other: Double) -> Double
truncatingRemainder との動作の違いは、剰余の絶対値をできるだけ小さくするために、オーバーシュートもすることです。(剰余として負の数を取り得ます)
example code
13.0.truncatingRemainder(dividingBy: 5) // 3
13.0.remainder(dividingBy: 5) // -2
2つ目の例は、剰余の絶対値を小さくするために、剰余が負になっているのがわかります。
まとめ
Swift での Double の剰余演算
- % の代替は、truncatingRemainder が用意されている
- 剰余の絶対値を小さくする remainder も用意されていて、ケースによっては便利
説明は以上です。
不明な点やおかしな点ありましたら、ご連絡いただけるとありがたいです。
Sponsor Link