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

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

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

受付中

【SwiftUI】リストに検索機能をつけたいのですが、息詰まっています。。。

mottyan09
Vchan250

総合スコア0

2回答

0リアクション

0クリップ

316閲覧

投稿2022/07/29 01:33

前提

SwiftUIで筋肉のリストのような物を作っています。

筋肉のリストの数が多いので検索機能をつけたいのですが、エラーが出てしまいます

Mmscleの配列の中からこの以下のコードを使って、検索できるようにしたいのですがエラーが発生してしまいます。何かコードの書き方が間違っているのかと思うのですが、教えて頂けると助かります。

コードの全体はこんな感じです。
エラーに関係なさそうなところはカットしています。

import SwiftUI struct Muscle: Identifiable { var id: Int let name: String let image: Image let move: String let origin: String let stop: String } struct ContentView: View { @State var searchText: String = "" let Muscles:[[Muscle]] = [ [.init(id: 0, name: "鎖骨下筋", image: Image("鎖骨下筋"), move:"水平屈強", origin: "ここが始まりだよ", stop: "ここが終わりだよ"), .init(id: 1, name: "小胸筋", image: Image("小胸筋"), move:"マッチョベリマッチョ", origin: "", stop: ""), .init(id: 2, name: "前鋸筋", image: Image("前鋸筋"), move:"水平屈強", origin: "", stop: “”), .init(id: 3, name: "小菱形筋", image: Image("小菱形筋"), move:"水平屈強", origin: "", stop: ""),], [ .init(id: 0, name: "三角筋", image: Image("三角筋"), move:"水平屈強", origin: "", stop: ""), .init(id: 1, name: "大胸筋", image: Image("大胸筋"), move:"水平屈強", origin: "", stop: ""), .init(id: 3, name: "棘下筋", image: Image("棘下筋"), move:"水平屈強", origin: "肩甲下筋", stop: "鳥口腕筋"), .init(id: 4, name: "鳥口腕筋", image: Image("鳥口腕筋"), move:"水平屈強", origin: "肩甲下筋", stop: "肩甲下筋")],] // 配列から情報を取り出すところ、エラーが出てしまう。 var filterMuscles: [String] { if searchText.isEmpty { return Muscles } else { return Muscles.filter { $0.name.contains(searchText) } } } var body: some View { NavigationView { List { ForEach(Muscles.startIndex...(Muscles.endIndex - 1), id: \.self) { section in Section(header: Text(self.swithHeaderTitle(section: section)) .font(.system(size: 30)) .fontWeight(.heavy) ) { ForEach(self.Muscles[section]) { Muscle in MuscleRow(Muscle: Muscle, move: self.swithHeaderTitle(section: section) ) } }.frame(height: 70) } }.navigationTitle(Text("筋肉図鑑")) .searchable(text: $searchText) } } var body: some View { NavigationView { List { ForEach(Muscles.startIndex...(Muscles.endIndex - 1), id: \.self) { section in Section(header: Text(self.swithHeaderTitle(section: section)) .font(.system(size: 30)) .fontWeight(.heavy) ) { ForEach(self.Muscles[section]) { Muscle in MuscleRow(Muscle: Muscle, move: self.swithHeaderTitle(section: section) ) } }.frame(height: 70) } }.navigationTitle(Text("筋肉図鑑")) .searchable(text: $searchText) } }

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

// ここがエラーが出てしまった箇所です。 var filterMuscles: [String] { if searchText.isEmpty { return Muscles } else { return Muscles.filter { $0.name.contains(searchText) } } } // エラーメッセージ Cannot convert return expression of type '[[Muscle]]' to return type '[String]' Cannot convert return expression of type '[[Muscle]]' to return type '[String]' Value of type '[Muscle]' has no member 'name'

質問が分かりずらかったらすみません。
一日かけて色々試してみましたが上手くいかず質問させて頂きました。

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

mottyan09

2022/07/29 03:17

var filterMuscles: [[Muscle]] { if searchText.isEmpty { return Muscles } else { return Muscles.filter { $0.name.contains(searchText) } } } 戻り値の型を[[Muscle]]に変えてみましたところ、次のエラーが出てしまいます。 エラーメッセージ→Value of type '[Muscle]' has no member 'name' 配列の書き方が良くないのでしょうか?
hoshi-takanori

2022/07/29 12:12

検索しない状態では 2 つのセクションに分けて表示しているようですが、検索した場合はどのように表示したいのでしょうか?
mottyan09

2022/07/30 02:03

ご返答いただきありがとうございます! コードが見やすいように2セクションで表示していますが、本当は9セクションぐらいあります。 検索した状態では、セクション関係なく.nameで検索かけてその.nemeが中にある配列を取り出したいと思っています。 今質問していただいて思ったのですが、セクションごとに分けてしまうとセクション関係なく検索するっていいうのは難しいのかなと、、、。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る