SwiftUIのプレビューで"Updating took more than 5 seconds"とエラーが発生する原因
環境
- macOS: 10.15 (Catalina)
- Xcode: 12.4
問題
XcodeでSwiftUIのコードを書く際に,プレビューを表示できます. しかし,このプレビュー機能がどうにもダメダメで,エラーの原因がわからず無駄に時間を浪費することがあります. (昔よりは良くなってると思いますが,Xcode 12.4でもまだダメダメですね・・・.)
よく遭遇するのが以下のエラーです.
Updating took more than 5 seconds
Updating a preview from HogeView_Previews SwiftUIProblem.app (28374) took more than 5 seconds.
プレビューに時間がかかった,みたいなエラーですが,原因が全くわかりません. エラーメッセージを検索すると色々な原因があるようですが,1つの原因としてランタイムエラーが発生している場合があります. コードサンプルとともに,実例を書いておきます.
問題が起きる例
例えば,以下のようなSwiftUIのビューを書いてみました.
import SwiftUI
struct HogeView: View {
@State var idx = 0
var cats = ["Tama", "Mike", "Kuro"]
var body: some View {
Text(cats[idx])
}
}
struct HogeView_Previews: PreviewProvider {
static var previews: some View {
HogeView(idx: 0)
}
}
@State var idx
のインデックスの猫名を表示するだけです.
プレビューすると以下のように表示されます.
ここで,HogeView_Previews
を次のように変更してみます.(配列の要素より大きいインデックスを指定する.)
struct HogeView_Previews: PreviewProvider {
static var previews: some View {
HogeView(idx: 3)
}
}
すると冒頭のUpdating took more than 5 seconds
というエラーが表示され,プレビューが表示されなくなりました.
プレビューエリアのDiagnostics
を押すと,次の画面が表示されます.
今回はわざとやったので,インデックスの指定が悪いのはわかっていますが,これらのエラーメッセージが表示されても,何が原因でプレビューが失敗しているのか原因がわかりません.
せめてHogeView(idx: 3)
の行にエラーが出てくれれば気付けるんですけどね・・・.
まとめ
ということで,Updating took more than 5 seconds
のエラーが表示された場合は,プレビュー用のstructがランタイムエラーが起きるコードになっている可能性があるので,そうなっていないか確認すると良いと思います.
ビューのコード(今回の例だとHogeView
)も,少し複雑になると,エラー行が特定できないエラー表示になったりするので,まだまだSwiftUIでコードを書くと辛みが多いな・・・と感じます.
まだ試していませんが,今ベータ版が出ているXcode13では改善されているとよいですね.