🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Xcode

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

Q&A

解決済

1回答

2166閲覧

【SwiftUI】構造体配列を別関数で動的に入力したい。

lucia0320

総合スコア15

Xcode

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

0グッド

0クリップ

投稿2021/02/11 13:34

編集2021/02/13 12:19

いつもお世話になっております。
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}

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

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

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

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

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

hoshi-takanori

2021/02/11 17:50 編集

nil を ! したら当然そうなるとしか…。ListArrayAdd で本当にしたいことは何ですか?
lucia0320

2021/02/12 08:48

ご確認ありがとうございます。 別途端末にUserDefaultsで保存しているBool型の配列データがあり、 その配列の要素でTrueのものだけを抽出し、リスト化することが目的となります。
hoshi-takanori

2021/02/12 08:58

ごめんなさい、よく分からないんですが、Bool の配列ってことは、例えば [true, false, true, false, true] から、[true, true, true] を抽出したいのでしょうか?
lucia0320

2021/02/12 09:49

大変申し訳ございません。 簡潔に書こうと思ったのですが、かえって分かりづらい質問となってしまいました。 質問内容を修正しましたのでご確認いただけますと幸いです。
hoshi-takanori

2021/02/12 11:14

修正ありがとうございます。 とりあえず、ContentView の var matrix:[ListArray]? = nil は使ってないようなので、不要ですね。 次に、ListArrayAdd の var matrix:[ListArray]? = nil ですが、初期値を nil にする必要がないと思います。 nullable である必要もないので、var matrix:[ListArray] = [] としましょう。 それから、配列に要素を追加するには append メソッドを使います。変数 i も不要です。 (FruitsBool がグローバル変数なのは…、動いてるみたいだからとりあえずいいことにしますか…。)
lucia0320

2021/02/13 05:12

ありがとうございます。 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 と 書き換えてもダメのようです・・・。 構造体配列に要素追加する際の記述法をご存知でしたらご教示頂けますでしょうか。 こちら調べてみたのですが、該当する記事が見当たりませんでした。
hoshi-takanori

2021/02/14 03:13

matrix!.append じゃなくて、matrix を [ListArray]? から [ListArray] に変更した上で matrix.append しましょう。 また、FruitsList.shared は FruitsList 型で、そこから [ListArray] を取り出すには matrix プロパティにアクセスする必要があります。(そもそも FruitsList 構造体の存在意義がよく分かりません…。)
lucia0320

2021/02/14 03:21

ありがとうございます。 解決いたしましたのでCloseとさせていただきます。
guest

回答1

0

ベストアンサー

とりあえずこういうことでしょうか。

swift

1func ListArrayAdd() -> [ListArray] { 2 3 let FruitsList1 = FruitsList.shared 4 var matrix: [ListArray] = [] 5 6 for n in 0...3 { 7 if FruitsBool[n] == true { 8 matrix.append(FruitsList1.matrix[n]) 9 } 10 } 11 12 return matrix 13}

またはこうも書けます。(書かなくていいです。)

swift

1func ListArrayAdd() -> [ListArray] { 2 return FruitsList.shared.matrix.enumerated().filter { (n, _) in FruitsBool[n] }.map { (_, x) in x } 3 4 // または 5 // return zip(FruitsBool, FruitsList.shared.matrix).compactMap { $0 ? $1 : nil } 6}

投稿2021/02/14 03:14

編集2021/02/14 03:18
hoshi-takanori

総合スコア7899

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

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

lucia0320

2021/02/14 03:21

ありがとうございます。 無事、動くことができました! 他の記述方法につきましてもありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問