Ambiguous use of 'subscript' quand j'importe MediaPlayer dans un projet

Hello à tous,

Je fais une application pour une web radio et je souhaite contrôler play, pause, stop, airplay et afficher la pochette du titre en cours sur le Lock Screen et dans le centre de contrôle.

D’après mes recherches, je dois utiliser le framework MediaPlayer que je dois importer dans mon projet. Mais voila, quand j’importe ce framework, j’ai une erreur sur 3 lignes :

Ambiguous use of ‹ subscript ›

dans ma fonction (qui fonctionne très bien jusqu’a ce que j’importe le framework) :

Est-ce que je suis sur la bonne route pour faire ce que je veux selon vous et si oui, comment puis-je corriger ces erreurs ?

Oh my god ! Des ! partout dans le code, partout, partout … Un vrai nid à plantage. Ton problème n’a rien a voir avec MediaPlayer, c’est une mauvaise « ouverture" des variables optionnelles.

Si je comprend bien, song est un dictionnaire, contenant un autre dictionnaire sous la clé « current ».

Essaye quelque chose comme :

if let song = response.result.value as? [String:AnyObject] {
  // Lecture du dictionnaire contenant la clé « current"
  if let mesInfos = song[« current »] {
     // lecture clé « artiste"
     if let artiste = mesInfos[« artiste] as? String {
       self.ui_currentArtist = artiste
    }
   // lecture clé « track"
    if let track = mesInfos[« track »] as? String {
       self.ui_currentSong = track
   }
 }
}

Je ne garantit pas la syntaxe, j’ai tapé de tête sans passer par Xcode, mais l’idée est là.

Le code n’utilise aucun ! forçant la conversion d’une variable optionnelle même si elle n’existe pas, source n°1 des plantages en Swift ! Le ! est une invention de Satan …

EDIT : quoi que … en relisant ton post, je vois que ce code fonctionnais correctement avant l’insertion de MediaPlayer. C’est curieux parce qu’il ne fait absolument pas appel au player !

Remplace quand même tout les ! par des if let. Ton code ne s’en portera que mieux. En plus cela permet d’éviter la syntaxe qui fait hurler Xcode.

Une idée comme ça : tu n’aurais pas changé récemment de version d’Xcode ? Xcode 9 est bien moins permissif qu’Xcode 8 sur la syntaxe de certaines instructions.

Hello @Draken

Merci pour ta réponse :blush: J’ai encore un peu de mal avec les if let :disappointed_relieved: Mais avec ton petit bout de code, je t’avoue que ca me permet d’y voir un peu plus clair ^^

Non, je suis sur la beta d’Xcode depuis la WWDC2017

J’ai toujours le meme soucis:

Hum … je me demande si ton song est vraiment un dictionnaire encapsulé dans un dictionnaire. Peux-tu afficher son contenu avec un PRINT pour voir ?

if let song = response.result.value as ? [String:AnyObject {
   print (« song : « , song)
   if let currentSong = song[« current »] {
      print (« ----« )
      print (« CurrentSong : « , currentSong)
  }
}

Et nous montrer ce qu’affiche le simulateur, à l’exécution ?

song :  ["old3": {
    artist = "Cheryl Crow";
    artistId = 1991;
    broadcastId = 2779674;
    cover = "http://xxxxxxxxxxxxxxxx.fr/pochettes/1991-3787.jpg";
    date = "12/09/2017";
    pochetteName = "1991-3787.jpg";
    shareLink = "http://xxxxxxxxxxxxxxxx.fr.fr/live/f3/3787";
    time = "18:23";
    track = "All i wanna do";
    trid = 3787;
}, "tweetLink": http://xxxxxxxxxxxxxxxx.fr.fr/live, "old1": {
    artist = Alma;
    artistId = 15361;
    broadcastId = 2779680;
    cover = "http://xxxxxxxxxxxxxxxx.fr.fr/pochettes/0-0.jpg";
    date = "12/09/2017";
    pochetteName = "15361-28465.jpg";
    shareLink = "http://xxxxxxxxxxxxxxxx.fr.fr/live/f3/28465";
    time = "18:31";
    track = "Chasing Highs";
    trid = 28465;
}, "onu3": {
    artist = "R.E.D.K.";
    artistId = 14555;
    broadcastId = 2779682;
    cover = "http://xxxxxxxxxxxxxxxx.fr.fr/pochettes/0-0.jpg";
    date = "12/09/2017";
    liveLink = "/live/u3";
    pochetteName = "14555-26570.jpg";
    sharleLink = "http://xxxxxxxxxxxxxxxx.fr.fr/live/u3/3787";
    time = "18:34";
    track = "Mars Music";
    trid = 26570;
    webradio = "Urban 3";
}, "twitter": xxxxxx, "webradio": xxxxxxxx 3, "choice": ong3, "ong3": {
    artist = "Shy'm";
    artistId = 10448;
    broadcastId = 2779684;
    cover = "http://xxxxxxxxxxxxxxxx.fr.fr/pochettes/10448-24357.jpg";
    date = "12/09/2017";
    liveLink = "/live/gold";
    pochetteName = "10448-24357.jpg";
    sharleLink = "http://xxxxxxxxxxxxxxxx.fr.fr/live/gold/3787";
    time = "18:36";
    track = "Prendre l'air";
    trid = 24357;
    webradio = "Gold Fr\U00e9qxxxxxxxxx";
}, "onsp": {
    artist = "Peggy Lee";
    artistId = 13947;
    broadcastId = 2494240;
    cover = "http://xxxxxxxxxxxxxxxx.fr.fr/pochettes/0-0.jpg";
    date = "02/01/2017";
    liveLink = "/live/xmas";
    pochetteName = "13947-25535.jpg";
    sharleLink = "http://xxxxxxxxxxxxxxxx.fr.fr/live/xmas/3787";
    time = "23:57";
    track = "It's Christmas Time Again";
    trid = 25535;
    webradio = "Fr\U00e9xxxxxxxxxxxx";
}, "next": {
    artist = "Fr\U00e9xxxxxxxxxxxxxxx";
    artistId = 0;
    broadcastId = 0;
    cover = "http://xxxxxxxxxxxxxxxx.fr.fr/pochettes/0-0.jpg";
    date = "06/01/2014";
    pochetteName = "0-0.jpg";
    shareLink = "http://xxxxxxxxxxxxxxxx.fr.fr/live";
    time = "21:00";
    track = "Thwxxxxxxxxxxxxxxxs";
    trid = 0;
}, "show": <__NSArray0 0x1c4009ea0>(

)
, "onf3": {
    artist = "Scissor Sisters";
    artistId = 5769;
    broadcastId = 2779683;
    cover = "http://xxxxxxxxxxxxxxxx.fr.fr/pochettes/5769-11134.jpg";
    date = "12/09/2017";
    liveLink = "/live";
    pochetteName = "5769-11134.jpg";
    sharleLink = "http://xxxxxxxxxxxxxxxx.fr.fr/live/f3/3787";
    time = "18:34";
    track = "I don't feel like dancing";
    trid = 11134;
    webradio = "xxxxxxxxxxxxx";
}, "current": {
    artist = "Scissor Sisters";
    artistId = 5769;
    broadcastId = 2779683;
    cover = "http://xxxxxxxxxxxxxxxx.fr.fr/pochettes/5769-11134.jpg";
    date = "12/09/2017";
    pochetteName = "5769-11134.jpg";
    shareLink = "http://xxxxxxxxxxxxxxxx.fr.fr/live/f3/11134";
    time = "18:34";
    track = "I don't feel like dancing";
    trid = 11134;
}, "old2": {
    artist = "Martin Jensen";
    artistId = 15100;
    broadcastId = 2779678;
    cover = "http://xxxxxxxxxxxxxxxx.fr.fr/pochettes/0-0.jpg";
    date = "12/09/2017";
    pochetteName = "15100-28308.jpg";
    shareLink = "http://xxxxxxxxxxxxxxxx.fr.fr/live/f3/28308";
    time = "18:28";
    track = "Solo Dance";
    trid = 28308;
}]
----
CurrentSong :  {
    artist = "Scissor Sisters";
    artistId = 5769;
    broadcastId = 2779683;
    cover = "http://xxxxxxxxxxxxxxxx.fr.fr/pochettes/5769-11134.jpg";
    date = "12/09/2017";
    pochetteName = "5769-11134.jpg";
    shareLink = "http://xxxxxxxxxxxxxxxx.fr.fr/live/f3/11134";
    time = "18:34";
    track = "I don't feel like dancing";
    trid = 11134;
}

Trouvé (enfin j’espère). J’ai reproduis une erreur similaire à la tienne sur un programme de test.

Je viens de comprendre que Alomofire convertit TOUT en Any, y compris les dictionnaires intégrés dans le dictionnaire principal. Un AnyObject n’étant PAS un dictionnaire, produit une erreur de subscript si on utilise la syntaxe AnyObject[indiceQuelconque].

Cela devrais fonctionner en ajoutant un casting lors de la lecture du second dictionnaire.

if let song = response.result.value as? [String:AnyObject] {
  // Lecture du dictionnaire contenant la clé « current »
  // ==> ET CONVERSION En Dictionnaire <==
  if let mesInfos = song[« current »] as? [String:AnyObject] {
     // lecture clé « artiste"
     if let artiste = mesInfos[« artiste] as? String {
       self.ui_currentArtist = artiste
    }
   // lecture clé « track"
    if let track = mesInfos[« track »] as? String {
       self.ui_currentSong = track
   }
 }
}

J’ai été long à la détente, trop occupé par la présentation des iPhones 8 et X.
Au fait, Xcode 9 GM est disponible en téléchargement depuis ce soir …

1 « J'aime »