質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

2198閲覧

Swiftで多重for文を回避したい

Hyperbolic4183

総合スコア17

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2020/05/17 04:53

編集2020/05/17 04:54

##起きている問題
前提として、SwiftUIではデータの計算量が多かったり処理が複雑だとコンパイルエラーが出るようになっています。

jsonファイルに書かれた3次元配列a"a": [[[255,211,210],[244,216,216],[242,226,226]],[[25,169,173],[255,177,179],[253,185,185],[236,192,191],[209,196,196]]]から要素を取り出し、背景色のRGB値にしたいです。

処理を簡単にする工夫の一つとして、背景色のRGB値の指定の時には3つの整数を指定するだけで済むようにしました。(この処理によってR値とB値までは変数で指定することができるようになった。)

それだけではまだ複雑な処理と判定されるようで、RGB値のB値のまで指定は文字を使って指定することができません。

##エラーコード
The compiler is unable to type-check this expression in reasonable time; try breaking up the expression into distinct sub-expressions

##懸念点
for文が繰り返されることで計算量が膨大になっていることが原因だと思っています。
クロージャや.map()を駆使して計算量を減らす工夫が必要だと思うのですが、どのように実装すれば良いでしょうか。

##ソースコード

メインのソースコード

swift

1import SwiftUI 2 3struct ColorCellView: View { 4 5 var colorData: colorData 6 var body: some View { 7 VStack { 8 HStack { 9 ForEach(0..<2) { i in 10 VStack(spacing: 5.0) { 11 12 Spacer() 13 14 ForEach(0..<self.colorData.a[i].count){ j in 15 Button(" ", action: { 16 print("tapped") 17 }) 18 .frame(width: 30, height: 50) 19 .background(Color.init(UIColor(self.colorData.a[i][j][0],self.colorData.a[i][j][1],self.colorData.a[0][0][2]))) 20 } 21 } 22 } 23 } 24 Spacer() 25 } 26 } 27} 28 29struct ContentView_Previews: PreviewProvider { 30 static var previews: some View { 31 ColorCellView(colorData: ColorData[0]) 32 } 33} 34 35extension UIColor { 36 37 convenience init(_ red: Int, _ green: Int, _ blue: Int, _ alpha: Int = 255) { 38 let rgba = [red, green, blue, alpha].map { i -> CGFloat in 39 switch i { 40 case let i where i < 0: 41 return 0 42 case let i where i > 255: 43 return 1 44 default: 45 return CGFloat(i) / 255 46 } 47 } 48 self.init(red: rgba[0], green: rgba[1], blue: rgba[2], alpha: rgba[3]) 49 } 50}

jsonファイルを格納する構造体

swift

1import SwiftUI 2 3struct colorData: Hashable, Codable { 4 var brightness: Int 5 var saturation: [Int] 6 var a: [[[Int]]] 7}

jsonファイル(用いているのはaのみ)

swift

1[ 2 { 3 "brightness": 9, 4 "saturation": [3,5,8,9,8,7,5,4,3], 5 "a": [[[255,211,210],[244,216,216],[242,226,226]],[[25,169,173],[255,177,179],[253,185,185],[236,192,191],[209,196,196]]] 6 } 7 8 9]

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

解決しました。以下に詳細を記し得られた知見を共有できればと思います。

SwiftUIではできるだけビューを細分化することが好まれるように思います。
質問文のメインのスースコードと示したコードをより細かく、つまりもう一つビューを作り、メインのソースコードの中でそのビューを書くことで解決しました。
操作もかなり軽くなったので、The compiler is unable to type-check this expression in reasonable time; try breaking up the expression into distinct sub-expressions で詰まった時はビューを細かくできないか見直すことをお勧めします。

投稿2020/05/29 00:41

Hyperbolic4183

総合スコア17

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問