カメラアプリを作成中、
ISO感度の上下限が端末に乗ってるカメラによってバラバラなことが判明。
特定の数値内でキリのいい数字(2の累乗)の値が欲しくなった。
多くのサイトではpow(_:_:)
を使うことを勧めているが、
こいつは戻り値がDecimalでFloatに型変換するのはちょっとめんどくさい。(っぽい)
pow(::) | Apple Developer Documentation
なぜかドキュメントは見つからなかったが、powlとpowfがあるのを確認。
powf(Float, Float)-> Float
powl(Double, Double)-> Double
こちらを使えば、FloatとDoubleで取得することが可能だった。
iOS15以上限定だけど、formatted()を使うとIntなどの型に変換することもできる。
let pow = pow(2, 2.0)
if #available(iOS 15.0, *) {
let IntPow = pow.formatted(.number)
} else {
// Fallback on earlier versions
}
今回はバージョン範囲の問題で目的と合わなかった為、使わなかった。
最終的に使用したISO感度を2の累乗で取得するコード
guard let minISO:Float = 33.0
guard let maxISO:Float = 3034.0
let startLog = log2(Float(minISO))
let startExponent = Int(ceil(startLog))
let endLog = log2(Float(maxISO))
let endExponent = Int(floor(endLog))
var indexedISOList = [String]()
for i in startExponent...endExponent {
// minISO<x<maxISOの範囲で2の累乗を求める
let settingIsoVal = powf(2, Float(i))
print(settingIsoVal)
}
// 64
// 128
// 256
// 512
// 1024
// 2048