Extraire les valeurs uniques d'un tableau

iLandesiLandes Membre
juillet 2016 modifié dans Objective-C, Swift, C, C++ #1

Bonjour,


 


Je cherche à  extraire la liste des catégories contenu dans un tableau de podcast. Chaque podcast à  un nom, une, date etc. et biensur une catégorie.


 


J'ai ce code qui fonctionne



func listOfCategory() -> [String] {
var uniqueCategory: [String] = []

for podcast in podcasts {
var isNewCategory = true

for otherCategory in uniqueCategory {
if let _category = podcast.category {
if _category == otherCategory {
isNewCategory = false
break
}
}
}

if isNewCategory {
if let _category = podcast.category {
uniqueCategory.append(_category)
}
}
}
return uniqueCategory
}

 J'aimerai faire un truc plus swifty. J'ai trouvé pour un tableau simple un code beaucoup plus swift qui fonctionne pour un tableau simple :



extension Array where Element: Hashable {
var setValue: Set<Element> {
return Set<Element>(self)
}
}

Ca marche, c'est beau comme du swift. Ca donne :



let names = ["John","Mary","Steve","Mary"]
let uniqueNames = names.setValue // {"John", "Mary", "Steve"}

J'aimerai adapter ce code à  mon tableau de podcast mais je sèche un peu.


 


D'avance merci pour votre aide

Mots clés:

Réponses

  • Je ne parle pas Swift, mais si j'ai bien compris, tu veux la liste des categories (pour un affichage/filtre par example) et donc un unicité dans ce retour.


    En Objective-C, je ferais donc ainsi : (note pas compilé, codé de tête)



    NSSet *categoriesSet = [NSSet setWithArray:[allPodcastes valueForKey:@category]];

    Sachant qu'il y a un moyen très rapide de passer de NSSet à  NSSArray au besoin.


  • AliGatorAliGator Membre, Modérateur
    juillet 2016 modifié #3
    func listOfCategory() -> Set<String> {
    return Set(podcasts.map { $0.category })
    }
  • AliGatorAliGator Membre, Modérateur
    Au passage, j'ai utilisé "map" en supposant que pour chaque podcast, "podcast.category" est une "String", et donc que "podcasts.map { $0.category }" retournera un tableau de "String".

    Si par contre "podcast.category" est un optional ("String?") " ce qui semble finalement être le cas en relisant ton code " alors utiliser map va résulter en un tableau de String? et non plus un tableau de String évidemment. Ce qui n'est pas ce que tu veux.
    Dans il suffit de remplacer "map" par "flatMap" qui fait la même chose que map sur un tableau, mais élimine les valeurs nil au passage.
  • Merci AliGator,


     


    J'adore passer de plus de 20 lignes de codes à  3. Je teste cela en début de semaine prochaine !


     


    Swift is Magic and Ali also.


  • La semaine dernière a durée 15 jours. 


     


    Merci à  tous


     


    A noter que j'ai changer le type de ma catégorie de String? en String.


Connectez-vous ou Inscrivez-vous pour répondre.