前提
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'
質問が分かりずらかったらすみません。
一日かけて色々試してみましたが上手くいかず質問させて頂きました。
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'
配列の書き方が良くないのでしょうか?
検索しない状態では 2 つのセクションに分けて表示しているようですが、検索した場合はどのように表示したいのでしょうか?
ご返答いただきありがとうございます!
コードが見やすいように2セクションで表示していますが、本当は9セクションぐらいあります。
検索した状態では、セクション関係なく.nameで検索かけてその.nemeが中にある配列を取り出したいと思っています。
今質問していただいて思ったのですが、セクションごとに分けてしまうとセクション関係なく検索するっていいうのは難しいのかなと、、、。
