我在Swift 3中有一个函数可以从MPMediaItems获取元数据 - 在本例中是Podcasts。
问题在于,对于一些较旧的Podcast,当我检索元数据Key而不是获取String时,我得到的NSTaggedPointerString对于我的目的来说基本上是空的 - 我无法将它与文字进行比较。
这是我所期望的一个例子(String):
这就是让我心痛的原因:
(我知道钥匙不一样,但不是问题)
如何从NSTaggedPointerString获取实际的String值,同时仍能获得/使用我也得到的更常见的String值?
这是我的功能:
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
}
另一个问题是:为什么我可以正确打印密钥的值,但不能将其用作字符串进行比较?
//This prints correctly
print("** key string:\(metadata.key!)")
// this yields myKey = ""
myKey = metadata.key as! String
修改
我取得了一些小进展,但仍然没有解决方案。我一直在修补我的代码,现在正在尝试这个:
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)")
}
}
看起来很奇怪,当我看到myKey
包含值(图1)并且我可以打印它时,我无法删除Optional()
指示符。当我添加!
时,该值变为空,我无法进行比较 - 但我仍然可以打印它! (图2)
编辑2: 最后一个解决方案!
@alDiablo有一个很好的建议,但只让我分道扬..我通过更多研究发现,问题的一部分是返回字符串中的leading Null char "\0"
。一旦我发现了,我就可以将其剥离并进行比较。
所以这是处理元数据键的结果代码:
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 :(得分:0)
试试这个:
let realString = NSString(string: nsTaggedPointerString)