エラー内容
frameの指定で以下のようなエラーが表示された。
Invalid frame dimension (negative or non-finite).
原因
エラー文を翻訳してみると、
フレームの寸法が無効です(負または非有限)。
ということで、マイナスになる可能性があるよという警告です。確かに、Viewの幅や高さの計算した値を入れていたので、マイナスになる可能性がありました。
例えば、以下のようなコードだと紫の警告が表示されてしまいます。
struct ContentView: View { var body: some View { Rectangle() .foregroundColor(.green) .frame(width: calcViewWidth(), height: 30) } private func calcViewWidth() -> CGFloat { let width: CGFloat = 10 - 12 return width } }
理由としては、width
がマイナスの可能性があるからです。というかこの場合はマイナスです。
解決方法
絶対にマイナスにならない方法で書きましょう。
警告を消すだけなら、return width
のところを以下のように、abs()
で囲ってあげることで、エラーが解消されます。
return abs(width)
.frame
のところを囲ってもOK
.frame(width: abs(calcViewWidth()), height: 30)
コード解説
abs()で囲うと、-の値が+になります。
let minusNumber = -30 let plusNumber = 30 print(abs(minusNumber)) // 30 print(abs(plusNumber)) // 30
ちゃんと対応するなら返す値をマイナスかどうかを判定し、マイナスの値だった場合0を代入するというふうに対応すれば良いかと思います。
参考文献