IndexPath.section IndexPath.Row

Bonjour,

A partir de ce tableau par exemple.

var tab = [“A1”,“A2”,“A3”,“B1”,“B2”,“C1”,“C2”,“C3”,“C4”]

comment créer une tableView avec section A,B,C?

Si je comprends le système: chaque indexPath.section à ses indexPath.row

Il faut arriver à créer

  • indexPath.section[0] = [“A1”,“A2”,“A3”] avec ses indexPath.row[0] = “A1” etc…
  • indexPath.section[1] = [“B1”,“B2”] avec ses indexPath.row[0] = “B1” etc…
  • indexPath.section[2] = [“C1”,“C2”,“C3”,“C4”] avec ses indexPath.row[0 ]= “C1” etc…

Bon ben voilà je galère pour créer un tableau dynamique avec tout ça bien rangé.

Merci pour vos aides

Gliou

Voici une solution utilisant le système de filtrage de Swift, pour séparer les différents composants de ton tableau. Attention c’est du Swift 4, donc Xcode 9. Cela ne fonctionnera pas en Swift 3.

let tab = ["A1", "A2", "A3", "B1", "B2", "C1", "C2", "C3", "C4"]
let tab_A = tab.filter({ Array($0)[0] == "A" })
let tab_B = tab.filter({ Array($0)[0] == "B" })
let tab_C = tab.filter({ Array($0)[0] == "C" })
print (tab_A)
print (tab_B)
print (tab_C)

Cela donne :

[« A1 », « A2 », « A3 »]
[« B1 », « B2 »]
[« C1 », « C2 », « C3 », "C4 »]

Comment ça marche ?

La fonction filter est un système génial permettant de créer un tableau à partir d’un autre tableau, à partir d’une condition de filtrage. J’en ai déjà parlé dans ce topic :

http://community.purplegiraffe.fr/t/tp-recopier-un-mot-afficher-dans-un-label/583/23?u=draken

Exemple d’utilisation :

let tab_A = tab.filter({ Array($0)[0] == "A" })

Ce code signifie : créer un tableau tab_A dont le contenu est composé de toutes les lignes du tableau tab dont le première caractère est la lettre « A ».

Comment je fais pour extraire la première lettre d’une chaîne de caractères ?

Swift 4 permet de convertir un String en un tableau de caractères avec Array. Il suffit de lire le premier indice du tableau pour lire le caractère du début.

let str = "ABCDEF"
let tableau = Array(str)
print ("Première lettre : ", tableau[0])

Première lettre : A

On peut faire autrement pour lire le premier caractère, mais j’aime bien la manière dont Swift 4 transforme un texte en tableau de caractères. Si tu utilises encore Xcode 8 et Swift 3, je peux t’expliquer une autre manière de lire la première lettre d’un String.

La manipulation des chaînes de caractères est expliqué dans le manuel Apple :

https://developer.apple.com/documentation/swift/string

2 « J'aime »

Merci Draken pour ta réponse.

En fait la fonction filter je l’utilise…mais mon gros problème c’est le tableau dynamique.
Je ne sais pas en fait si j’ai des A, des B, des C , des etc…
La variable let tab_A c’est ce A que je souhaite qu’il soit dynamique.

Arfff je ne sais pas si je me fait comprendre.

Euh … bin en fait … pas vraiment !

Hello,

Il suffit simplement de crée un tableau qui contient ds tableau. Dans ton cas tu utilise les filter que @Draken ta montré, tu stock ces tableau dans un tableau.

Concrètement:

let tab = [« A1 », « A2 », « A3 », « B1 », « B2 », « C1 », « C2 », « C3 », « C4 »]
let tab_A = tab.filter({ Array($0)[0] == « A » })
let tab_B = tab.filter({ Array($0)[0] == « B » })
let tab_C = tab.filter({ Array($0)[0] == « C » })
print (tab_A)
print (tab_B)
print (tab_C)

let sectionArray = [tab_A,tab_B,tab_C]

Dans ta tableview:

func numberOfSections(in tableView: UITableView) → Int {
return sectionArray.count
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) → Int {
return sectionArray[section].count
}

Merci BEAUCOUP Messieurs

J’avance petit à petit…mais je me régale :slight_smile:

Je me permets d’intervenir pour un petit conseil : le principe de la fonction filter est super pour filtrer une fois un tableau, par contre si vous vous en servez pour trier un tableau en catégories, vous allez parcourir l’intégralité du tableau pour chacune des catégories.
Si le tableau est volumineux ou que vous avez beaucoup de catégories il vaut mieux parcourir manuellement le tableau. Par exemple :

var tab = ["A1","A2","A3","B1","B2","C1","C2","C3","C4"]
var tabA:[String] = []
var tabB:[String] = []
var tabC:[String] = []
for item in tab {
    if let firstLetter = item.uppercased().first {
        switch firstLetter {
        case "A":
            tabA.append(item)
        case "B":
            tabB.append(item)
        case "C":
            tabC.append(item)
        default:
            print("Tableau non prévu pour \(item)")
        }
    }
} 

Le résultat final est le même mais au moins vous ne faites qu’une seul tour de tableau (ici 9 répétitions) alors qu’en utilisant les 3 filter, il effectue 10 répétitions par filter (copier le code dans un Storyboard pour le voir) soit 30 répétitions en tout

Oui en effet :thinking: :thinking: :thinking:

Merci