いつもお世話になっております。
SwiftUI初心者です。
Bool型の配列と、構造体の配列の2つがあり
Bool型の配列でTrueの場合、同じ添字の構造体要素(name)を抽出し
リストで表示するプログラムを組んでおりますが
エラーが出てしまい、処理を継続することができません。
どうすれば良いか分からず、ご教示いただけますと幸いです。
エラー内容
Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value
プログラム説明
ユーザーの方で設定するBool型配列をUserDefaultsで保存/読み込みを行います。
下記例ではBool型配列でTrueのとき同様の添字のFruitsListとなるマスタを抽出したいと思っております。
例)
【FruitsList】
りんご
バナナ
みかん
グレープフルーツ
【BoolList】
True
False
False
False
上記のとき、りんごをリストに表示
BoolListですべてFalseのとき、リストには何も表示しません。
以下、プログラムです。
プログラム
SwiftUI
1import SwiftUI 2 3public var FruitsBool:[Bool] = UserDefaults.standard.object(forKey: "FruitsBool") as? [Bool] ?? [false,false,false,false] 4 5struct ListArray: Identifiable { 6 let id: Int 7 let name: String 8} 9 10class FruitsList { 11 private init() {} 12 13 static let shared = FruitsList() 14 15 let matrix: [ListArray] = [ 16 ListArray(id: 1 , name: "りんご"), 17 ListArray(id: 2 , name: "バナナ"), 18 ListArray(id: 3 , name: "みかん"), 19 ListArray(id: 4 , name: "グレープフルーツ"), 20 ] 21} 22 23struct ContentView: View { 24 25 var matrix:[ListArray]? = nil 26 27 var body: some View { 28 29 NavigationView { 30 31 List(ListArrayAdd()) { ListArray in 32 33 Text(ListArray.name) 34 35 } 36 } 37 } 38} 39 40func ListArrayAdd() -> [ListArray] { 41 42 let FruitsList1 = FruitsList.shared 43 var matrix:[ListArray]? = nil 44 var i:Int = 0 45 46 for n in 0...3 { 47 48 if FruitsBool[n] == true { 49 50 matrix![i] = ListArray(id: FruitsList1[n].id , name: FruitsList1[n].name) 51 i += 1 52 } 53 } 54 55 return matrix! 56 57} 58 59 60struct ContentView_Previews: PreviewProvider { 61 static var previews: some View { 62 ContentView() 63 } 64}
nil を ! したら当然そうなるとしか…。ListArrayAdd で本当にしたいことは何ですか?
ご確認ありがとうございます。
別途端末にUserDefaultsで保存しているBool型の配列データがあり、
その配列の要素でTrueのものだけを抽出し、リスト化することが目的となります。
ごめんなさい、よく分からないんですが、Bool の配列ってことは、例えば [true, false, true, false, true] から、[true, true, true] を抽出したいのでしょうか?
大変申し訳ございません。
簡潔に書こうと思ったのですが、かえって分かりづらい質問となってしまいました。
質問内容を修正しましたのでご確認いただけますと幸いです。
修正ありがとうございます。
とりあえず、ContentView の var matrix:[ListArray]? = nil は使ってないようなので、不要ですね。
次に、ListArrayAdd の var matrix:[ListArray]? = nil ですが、初期値を nil にする必要がないと思います。
nullable である必要もないので、var matrix:[ListArray] = [] としましょう。
それから、配列に要素を追加するには append メソッドを使います。変数 i も不要です。
(FruitsBool がグローバル変数なのは…、動いてるみたいだからとりあえずいいことにしますか…。)
ありがとうございます。
matrix!.append(ListArray(id: FruitsList1[n].id , name: FruitsList1[n].name))
上記にこちらに書き換えてみたのですが以下のエラーが出てしまいます。
Value of type 'FruitsList' has no subscripts
let FruitsList1 = FruitsList.shared を
let FruitsList1:[ListArray] = FruitsList.shared と
書き換えてもダメのようです・・・。
構造体配列に要素追加する際の記述法をご存知でしたらご教示頂けますでしょうか。
こちら調べてみたのですが、該当する記事が見当たりませんでした。
matrix!.append じゃなくて、matrix を [ListArray]? から [ListArray] に変更した上で matrix.append しましょう。
また、FruitsList.shared は FruitsList 型で、そこから [ListArray] を取り出すには matrix プロパティにアクセスする必要があります。(そもそも FruitsList 構造体の存在意義がよく分かりません…。)
ありがとうございます。
解決いたしましたのでCloseとさせていただきます。
回答1件
あなたの回答
tips
プレビュー