2017-04-02 57 views
1

我在Swift 3中有一个从MPMediaItems获取元数据的函数 - 在本例中为Podcasts。获取NSTaggedPointerString,但期待字符串 - 如何在Swift 3中解决?

问题是,对于一些较旧的Podcast,当我检索元数据Key而不是获取字符串时,我得到一个NSTaggedPointerString,对我而言实质上是空的 - 我无法将其与文字进行比较。

这里是我的期望(串)的例子:

enter image description here

,这里是什么让我心痛:

enter image description here

(我知道钥匙是不一样的但这不是问题)

如何从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)

图片1 pic 1

PIC 2 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! 
} 
+0

这是一个“为NSString的内部类”,你不应该担心。如果它是空的,那么你的字符串是空的。 – Larme

+0

@Larme - 感谢您的回复,但我认为您没有关注我的帖子。我可以清楚地打印出一个值,所以它不是空的。同样,它在自己使用时会产生“”。 – wayneh

回答

0

试试这个:

let realString = NSString(string: nsTaggedPointerString)

+0

我目前正在安装Xcode 8.3,并且这是永久的,但我会在今晚晚些时候尝试您的解决方案。 – wayneh

+0

好的,我终于搞定了!你的建议确实有帮助,但并不是完整的答案。我仍然给你赏金点,因为它确实帮助我到达那里。我编辑了我的OP来反映最终的代码。谢谢。 – wayneh

+0

谢谢,我会在我的书中注意到这一点。稍后会帮助我:) – alDiablo

相关问题