获取NSTaggedPointerString,但期待字符串 - 如何在Swift 3中解决?
问题描述:
我在Swift 3中有一个从MPMediaItems获取元数据的函数 - 在本例中为Podcasts。获取NSTaggedPointerString,但期待字符串 - 如何在Swift 3中解决?
问题是,对于一些较旧的Podcast,当我检索元数据Key而不是获取字符串时,我得到一个NSTaggedPointerString,对我而言实质上是空的 - 我无法将其与文字进行比较。
这里是我的期望(串)的例子:
,这里是什么让我心痛:
(我知道钥匙是不一样的但这不是问题)
如何从NSTaggedPointerString中获取实际的字符串值同时仍然能够获得/使用我也获得的更常见的字符串值?
这里是我的功能:
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()
指标。当我添加!
时,该值变空,我无法进行比较 - 但我仍然可以打印它! (PIC 2)
编辑2: 最后一个解决方案!
@alDiablo有一个很好的建议,但只让我分道扬012。我通过更多的研究发现,部分问题是返回字符串中的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!
}
这是一个“为NSString的内部类”,你不应该担心。如果它是空的,那么你的字符串是空的。 – Larme
@Larme - 感谢您的回复,但我认为您没有关注我的帖子。我可以清楚地打印出一个值,所以它不是空的。同样,它在自己使用时会产生“”。 – wayneh