1

J'ai une fonction dans Swift 3 qui obtient des métadonnées de MPMediaItems - dans ce cas, des podcasts. Le problème est que pour certains podcasts plus anciens, lorsque je récupère une clé de métadonnées au lieu d'obtenir une chaîne, j'obtiens un NSTaggedPointerString qui est essentiellement vide pour mes besoins - je ne peux pas le comparer à un littéral.Obtenir NSTaggedPointerString mais attendre String - comment résoudre dans Swift 3?

Voici un exemple de ce que je pense (String):

enter image description here

Et voici ce qui me donne des brûlures d'estomac:

enter image description here

(je sais que les clés ne sont pas les mêmes mais ce n'est pas le problème)

Comment puis-je obtenir la valeur String réelle de NSTaggedPointerString tout en étant capable d'obtenir/utiliser les valeurs String les plus courantes que j'obtiens aussi?

Voilà ma fonction:

func getMeta(_ item: MPMediaItem)->String{ 
    print("") 
    print("--------- GETMETA ---------") 
    let url = item.value(forProperty:MPMediaItemPropertyAssetURL) as? NSURL 
    let asset = AVURLAsset(url: url as! URL, options: nil) 

    var sTDES: String = "" 
    var sUSLT: String = "" 
    var sCOMM: String = "" 
    var sTIT3: String = "" 
    var sFinal: String = "" 

    for metadata in asset.metadata{ 
     print("sKey:\(metadata.key)") 
     print("stringValue:\(metadata.stringValue)") 
     if let sKey = metadata.key{ 

      // All of these comparisons fail if the Key is NSTaggedPointerString 
      if (sKey as! String == "TDS") || (sKey as! String == "TDES"){ 
       if let xtdes = metadata.stringValue{ 
        sTDES = xtdes 
       } 
      }else if (sKey as! String == "COM") || (sKey as! String == "COMM"){ 
       if let xcomm = metadata.stringValue{ 
        sCOMM = xcomm 
       } 
      }else if (sKey as! String == "USLT"){ 
       if let xuslt = metadata.stringValue{ 
        sUSLT = xuslt 
       } 
      }else if (sKey as! String == "TIT3") || (sKey as! String == "TT3"){ 
       if let xtit3 = metadata.stringValue{ 
        sTIT3 = xtit3 
       } 
      } 
     } 
    } 
    //Use the preferred value if available 
    if sTDES != ""{ 
     sFinal = sTDES 
    }else if sCOMM != ""{ 
     sFinal = sCOMM 
    }else if sUSLT != ""{ 
     sFinal = sUSLT 
    }else if sTIT3 != ""{ 
     sFinal = sTIT3 
    }else{ 
     sFinal = " " 
    } 
    print("sFinal 1:\(sFinal)") 

    return sFinal 
} 

Une autre question est la suivante: Pourquoi puis-je imprimer la valeur de la clé correctement, mais pas l'utiliser comme une chaîne de comparaison?

//This prints correctly 
print("** key string:\(metadata.key!)") 
// this yields myKey = "" 
myKey = metadata.key as! String 

EDIT:

Je fais quelques petits progrès, mais toujours pas de solution. J'ai été bricoler avec mon code et essaie maintenant ceci:

let metaArray = asset.metadata(forFormat: "org.id3") 
for metadata in metaArray{ 
    print("** metadata key:\(metadata.key!)") 
    let myKey = String(describing: metadata.key!) // The ! results in empty value, while keeping it results in Optional 
    print("** myKey:\(myKey)") 
    if myKey == "TDS"{ 
     print("value:\(metadata.stringValue)") 
    } 
} 

Il semble si étrange que quand je vois que myKey contient une valeur (pic 1) et je peux l'imprimer, je ne suis pas en mesure de retirez l'indicateur Optional(). Quand j'ajoute le ! la valeur devient vide et je ne peux pas faire une comparaison - mais je peux toujours l'imprimer! (Photo 2)

pic 1 pic 1

pic 2 pic 2

EDIT 2: Enfin une solution!

@alDiablo a eu une bonne suggestion, mais seulement eu moi à mi-chemin. J'ai découvert plus de recherches qu'une partie du problème était leading Null char "\0" dans la chaîne retournée. Une fois que j'ai découvert cela, je pourrais le retirer et faire ma comparaison.

est donc ici le code résultant pour gérer la clé de métadonnées:

let realString = NSString(string: metadata.key! as! String) //There is probably a cleaner way to do this too 
let sKey = realString.replacingOccurrences(of: "\0", with: "") 
if (sKey == "TDS") || (sKey == "TDES"){ 
     //Success! 
} 
+0

Il est une « classe interne pour NSString », ne vous inquiétez pas à ce sujet . Si c'est vide, alors votre chaîne est vide. – Larme

+0

@Larme - Merci pour la réponse, mais je ne pense pas que vous avez suivi mon poste. Je peux clairement imprimer une valeur pour qu'elle ne soit pas vide. De même, il cède "" lorsqu'il est utilisé seul. – wayneh

Répondre

0

Essayez ceci:

let realString = NSString(string: nsTaggedPointerString)

+0

J'installe actuellement Xcode 8.3 et cela prend une éternité, mais j'essaierai votre solution plus tard ce soir. – wayneh

+0

OK, je l'ai enfin réussi! Votre suggestion a aidé, mais n'était pas une réponse complète. Je vous donne toujours les points de primes parce que cela m'a aidé à y arriver. J'ai modifié mon OP pour refléter le code final. Merci. – wayneh

+0

Merci pour cela, je vais noter ce point dans mon livre. M'aidera plus tard :) – alDiablo