【SwiftUI】紫のエラー:Invalid frame dimension (negative or non-finite).の解決方法

エラー内容

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を代入するというふうに対応すれば良いかと思います。