##起きている問題
前提として、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]
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。