概要
Gridを使った以下のようなViewを作成している際にPreviewで'ColorsView' initializer is inaccessible due to 'private' protection level
のエラーが発生した。
環境
Xcode 14.0.1
struct ColorsView: View {
@State var colors: [Color]
private var columns: [GridItem] = Array(repeating: GridItem(.flexible(), spacing: 16), count: 2)
var body: some View {
ScrollView(.vertical) {
LazyVGrid(columns: columns, alignment: .center, spacing: 16) {
ForEach($colors, id: \.self) { color in
color
.wrappedValue
.frame(height: 150)
}
}
.padding()
}
}
}
struct ColorsView_Previews: PreviewProvider {
@State static var colors: [Color] = [.red, .blue, .yellow, .green, .pink, .purple, .orange]
static var previews: some View {
ColorsView(colors: colors)
}
}
解決方法
@State
変数、同じstructの変数がvarであるため発生していた模様。letに変えて解決.。
private let columns: [GridItem] = Array(repeating: GridItem(.flexible(), spacing: 16), count: 2)
varであっても初期化されているのだから問題ないような...
別の方法
イニシャライザを使い初期化
@State private var colors: [Color]
private var columns: [GridItem] = Array(repeating: GridItem(.flexible(), spacing: 16), count: 2)
init(colors: [Color]) {
self.colors = colors
}
イニシャライザを使う方法であれば@State
の変数もprivateにでき、別の変数もvarのままで使える。
多分こっちが正解