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

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

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

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

Q&A

解決済

1回答

14167閲覧

SwiftUIでForEachを使う時にエラーが出る時の対処方法

Hyperbolic4183

総合スコア17

Xcode

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

0グッド

0クリップ

投稿2020/05/09 08:10

前提・実現したいこと

SwiftUIでオブジェクトの背景色をグラデーションで表現したいです。
ForEach文でテキストを複数表示させ、RGB値が10ずつあがるようコーディグしたいです。

発生している問題・エラーメッセージ

Initializer 'init(_:id:content:)' requires that 'Double.Stride' (aka 'Double') conform to 'SignedInteger'

該当のソースコード

上のコードはForEachを用いずに書いたものです。
同じものをForEachで書きたいです。

Swift

1import SwiftUI 2 3struct SwiftUIView: View { 4 var body: some View { 5 HStack { 6 VStack { 7 Text("Hello, World!") 8 .background(Color(red: 0/255, green: 1, blue: 1)) 9 Text("Hello, World!") 10 .background(Color(red: 50/255, green: 1, blue: 1)) 11 Text("Hello, World!") 12 .background(Color(red: 100/255, green: 1, blue: 1)) 13 Text("Hello, World!") 14 .background(Color(red: 150/255, green: 1, blue: 1)) 15 Text("Hello, World!") 16 .background(Color(red: 200/255, green: 1, blue: 1)) 17 Text("Hello, World!") 18 .background(Color(red: 250/255, green: 1, blue: 1)) 19 20 } 21 VStack { 22 ForEach(1...6, id: .self){i in 23 Text("Hello, World!") 24 .background(Color(red: i*10/255, green: 1, blue: 1)) 25 } 26 27 } 28 } 29 } 30} 31 32struct SwiftUIView_Previews: PreviewProvider { 33 static var previews: some View { 34 SwiftUIView() 35 } 36} 37

試したこと

Int型の変数iをDouble型に変換した。
iに@State属性がないことが原因かと思い、

Swift

1import SwiftUI 2 3struct SwiftUIView: View { 4 @State private var i = 0 5 var body: some View { 6 7 HStack { 8 VStack { 9 Text("Hello, World!") 10 .background(Color(red: 0/255, green: 1, blue: 1)) 11 Text("Hello, World!") 12 .background(Color(red: 50/255, green: 1, blue: 1)) 13 Text("Hello, World!") 14 .background(Color(red: 100/255, green: 1, blue: 1)) 15 Text("Hello, World!") 16 .background(Color(red: 150/255, green: 1, blue: 1)) 17 Text("Hello, World!") 18 .background(Color(red: 200/255, green: 1, blue: 1)) 19 Text("Hello, World!") 20 .background(Color(red: 250/255, green: 1, blue: 1)) 21 22 } 23 VStack { 24 ForEach(1...6, id: .self){_ in 25 Text("Hello, World!") 26 .background(Color(red: Double(self.i*10/255), green: 1, blue: 1)) 27 i += 10 28 } 29 30 } 31 } 32 } 33} 34 35struct SwiftUIView_Previews: PreviewProvider { 36 static var previews: some View { 37 SwiftUIView() 38 } 39} 40

としましたが、Type '()' cannot conform to 'View'; only struct/enum/class types can conform to protocolsというエラーが出ました。

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

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

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

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

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

guest

回答1

0

ベストアンサー

以下のように書き換えたら動きました。

  • @State private var i は不要です。@State は View が持つ「状態」のことですが、i は単なるループ変数で、状態ではありません。
  • i はクロージャの引数で受け取れます。
  • ForEach には closed range (1...6) は使えないので、open range (1..<7) で書き換える必要がありますが、意味的には多分 0..<6 ではないでしょうか。
  • Double(i * 50 / 255) だと括弧の中が Int のまま計算されて 0 になってしまいます。

swift

1 VStack { 2 ForEach(0..<6) { i in 3 Text("Hello, World!") 4 .background(Color(red: Double(i * 50) / 255, green: 1, blue: 1)) 5 } 6 }

(それにしても SwiftUI のエラーメッセージは不親切すぎますね。来月の WWDC に期待…。)

投稿2020/05/09 13:58

編集2020/05/09 14:00
hoshi-takanori

総合スコア7899

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

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

Hyperbolic4183

2020/05/10 00:46

解決しました。本当にありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問