エラー内容
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を代入するというふうに対応すれば良いかと思います。
参考文献

