前提・実現したいこと
SwiftUI のビュー内での再代入がうまくできません。
self.foo += 1
という記述はコンパイルではエラーがでませんが、別の行でエラーがでてしまいます。
この行をコメントアウトすると、別の行で出ていたエラーもなくなるので、根本的な原因は代入を行っている行ではないかと疑っているところですが、解決方法が見当たりません。
具体的にやりたいことはカレンダーの作成なのですが、ループ内で条件判定を行なった上、フラグを立てたり、変数の値を変えたりしたいと考えています。
アルゴリズム自身は問題がないことを確認済みで、Playgroundで動くことを確認の上、コードを少しづつ移植しているところでした。
代入ではありませんが、ビュー内部で条件分岐や for 文も使えないようなので、SwiftUIの制限なのかとも思っています。
ちなみに、条件分岐は Group {} で囲むことで回避できること、for は ForEach で回避できることを知り、解決できました。
Cでの記述についてはそこそこ理解可能です。C++もコードをざっと眺める程度であれば理解できますが、Swiftは最近学習し始めました。
発生している問題・エラーメッセージ
\'Int\' is not convertible to \'CGFloat\' ---------------------------------------- SchemeBuildError: Failed to build the scheme "PrintMonth" 'Int' is not convertible to 'CGFloat' Compile /Users/.../Documents/Xcode/iOS/PrintMonth/PrintMonth/ContentView.swift: /Users/.../Documents/Xcode/iOS/PrintMonth/PrintMonth/ContentView.swift:132:80: error: 'Int' is not convertible to 'CGFloat' .background(RoundedRectangle(cornerRadius: 5)
該当のソースコード
ソースコードはかなり長いので、該当部分と直接関係ありそうな部分だけ抜粋します。
SwiftUI(Xcode
1struct printMonth: View { 2 @State var year: Int 3 @State var month: Int 4 5 var firstDayFlag: Bool = true 6 var d: Int = 1 7 8 var body: some View { 9 HStack{ 10 ForEach( 0 ..< 7){ week in 11 // 日付を表示するループ 12 VStack{ 13 Group{ 14 if self.firstDayFlag && week < dayOfWeek(year: self.year, month: self.month, day: 1) { 15 Text("") 16 Text("") 17 } else if self.d > getLastDay(year: self.year, month: self.month) { 18 Text("") 19 Text("") 20 } else { 21 // 以下の二行をコメントアウトするとコンパイルが通る 22 self.firstDayFlag = false 23 self.d += 1 24 25 // 日付の表示 26 Text("(row * 7 + week + 1)") 27 .font(.subheadline) 28 .padding(-15) 29 30 // 本文 31 Text("") 32 } 33 } 34 } 35 .foregroundColor(.black) 36 .multilineTextAlignment(.trailing) 37 .frame(width: self.w, height: 50) 38 .background(RoundedRectangle(cornerRadius: 5) // エラーが出る行 39 .frame(width: self.w) 40 .foregroundColor(Color(red: 0.95, green: 0.95, blue: 0.95))) 41 } 42 } 43} 44
試したこと
前述の通り、代入している行を消すとビルドエラーもなくなり、プレビューも正常に表示されます。
補足情報(FW/ツールのバージョンなど)
Xcode 11.3

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/01/13 04:02