获取NSTaggedPointerString但期待String - 如何在Swift 3中解析?

时间:2017-04-02 04:53:09

标签: swift3 nsstring avfoundation avasset nstaggedpointerstring

我在Swift 3中有一个函数可以从MPMediaItems获取元数据 - 在本例中是Podcasts。

问题在于,对于一​​些较旧的Podcast,当我检索元数据Key而不是获取String时,我得到的NSTaggedPointerString对于我的目的来说基本上是空的 - 我无法将它与文字进行比较。

这是我所期望的一个例子(String):

enter image description here

这就是让我心痛的原因:

enter image description here

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

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

照片1 pic 1

pic 2 pic 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!
}

1 个答案:

答案 0 :(得分:0)

试试这个:

let realString = NSString(string: nsTaggedPointerString)