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

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

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

Q&A

解決済

1回答

249閲覧

SwiftUI リストをセクションで区切るとき

kazuma1190

総合スコア3

0グッド

0クリップ

投稿2023/02/03 15:07

編集2023/02/04 02:23

実現したいこと

iPhoneにある連絡先アプリの一覧画面のような、あいうえお順(濁点のものも同じセクション)でセクションで区切る。

前提

連絡先の情報は、APIで取得しています。

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

エラーメッセージではないのですが、濁点があっても同じセクションに入れる方法がわからない状況です。

該当のソースコード

コードは抜粋しています。

SwiftUI

1struct ContactListView: View { 2 let kanadata = ["ア","イ","ウ","エ","オ","カ","キ","ク","ケ","コ","サ","シ","ス","セ","ソ","タ","チ","ツ","テ","ト","ナ","ニ","ヌ","ネ","ノ","ハ","ヒ","フ","ヘ","ホ","マ","ミ","ム","メ","モ","ヤ","ユ","ヨ","ラ","リ","ル","レ","ロ","ワ"] 3 4var body: some View { 5NavigationView{ 6 VStack{ 7 List{ 8 ForEach(kanadata, id: \.self) { kana in 9 10 let filteredContact = contact.filter{ $0.first_name_kana.hasPrefix(kana)} 11 12 if !filteredContact.isEmpty { 13 14 Section(header: Text("\(kana)")) { 15 16 ForEach(contact.filter{ $0.first_name_kana.hasPrefix(kana)}, id: \.contact_id) { item in 17 18 NavigationLink(destination: ContactView(contactId: item.contact_id)){ 19 HStack{ 20 Text(item.first_name) 21 Text(item.last_name) 22 } 23 }

試したこと

下記の条件を修正してみましたが、うまくいきませんでした。
修正前
let filteredContact = contact.filter{ $0.first_name_kana.hasPrefix(kana)}
修正後
let filteredContact = contact.filter{ $0.first_name_kana.hasPrefix(kana) || contact.filter{ $0.first_name_kana.hasPrefix((kana + "゛"))}}

補足情報(FW/ツールのバージョンなど)

どのような方法で実現可能なのか分からず、困っています。

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

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

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

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

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

kazuma1190

2023/02/04 02:27

回答いただきありがとうございました。 頂いた情報を参考に格納したデータをセクションで区切るところまではできました。 もし可能であれば教えていただければと思ってますが、濁点付きの文字も同じセクションに入れたい場合どのような実装になるでしょうか?
hoshi-takanori

2023/02/04 17:15

ガやパやをそれぞれカ、ハなどのセクションに入れる処理を、地道に書くしかないかと…。やり方はいろいろ考えられますが。
kazuma1190

2023/02/04 23:50

コメントありがとうございます。 上記の試したこと、のような方法しか思い浮かばなかったのですが、他にはどのような方法があるのでしょうか?
guest

回答1

0

自己解決

下記追加で解決。
'''Swift
let kana_table = [
["ア","あ"],["イ","い"],["ウ","う"],["エ","え"],["オ","お"],
["カ","か"],["キ","き"],["ク","く"],["ケ","け"],["コ","こ"],
["サ","さ"],["シ","し"],["ス","す"],["セ","せ"],["ソ","そ"],
["タ","た"],["チ","ち"],["ツ","つ"],["テ","て"],["ト","と"],
["ナ","な"],["ニ","に"],["ヌ","ぬ"],["ネ","ね"],["ノ","の"],
["ハ","は"],["ヒ","ひ"],["フ","ふ"],["ヘ","へ"],["ホ","ほ"],
["マ","ま"],["ミ","み"],["ム","む"],["メ","め"],["モ","も"],
["ヤ","や"],["ユ","ゆ"],["ヨ","よ"],
["ラ","ら"],["リ","り"],["ル","る"],["レ","れ"],["ロ","ろ"],
["ワ","わ"],["ヲ","を"],["ン","ん"],
["ガ","か"],["ギ","き"],["グ","く"],["ゲ","け"],["ゴ","こ"],
["ザ","さ"],["ジ","し"],["ズ","す"],["ゼ","せ"],["ゾ","そ"],
["ダ","た"],["ヂ","ち"],["ヅ","つ"],["デ","て"],["ド","と"],
["バ","は"],["ビ","ひ"],["ブ","ふ"],["ベ","へ"],["ボ","ほ"]
]

let filteredContact = contact.filter {
let first_name_kana = $0.first_name_kana
let first_name_kana_prefix = String(first_name_kana.prefix(1))
if let index = kana_table.firstIndex(where: { $0[0].hasPrefix(first_name_kana_prefix) }) {
return kana == kana_table[index][1]
}
return first_name_kana.hasPrefix(kana)
}
'''

投稿2023/02/06 02:49

kazuma1190

総合スコア3

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問