Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift3 获取NSTaggedPointerString但需要字符串-如何在Swift 3中解析?_Swift3_Nsstring_Avfoundation_Avasset_Nstaggedpointerstring - Fatal编程技术网

Swift3 获取NSTaggedPointerString但需要字符串-如何在Swift 3中解析?

Swift3 获取NSTaggedPointerString但需要字符串-如何在Swift 3中解析?,swift3,nsstring,avfoundation,avasset,nstaggedpointerstring,Swift3,Nsstring,Avfoundation,Avasset,Nstaggedpointerstring,我在Swift 3中有一个函数,它从MPMediaItems(本例中为播客)获取元数据 问题是,对于一些较旧的播客,当我检索元数据键而不是获取字符串时,会得到一个NSTaggedPointerString,它本质上是空的,我无法将其与文本进行比较 下面是我期望的示例(字符串): 以下是让我心痛的原因: (我知道钥匙不一样,但这不是问题所在) 如何从NSTaggedPointerString获取实际字符串值,同时仍然能够获取/使用更常见的字符串值 以下是我的功能: func getMeta(_

我在Swift 3中有一个函数,它从MPMediaItems(本例中为播客)获取元数据

问题是,对于一些较旧的播客,当我检索元数据键而不是获取字符串时,会得到一个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()
指示器。当我添加
值变为空,我无法进行比较-但我仍然可以打印它!!(图2)

图1

图2

编辑2: 终于有了解决办法

@alDiablo提出了一个很好的建议,但只是帮了我一个忙。我通过更多的研究发现,部分问题是返回字符串中的
前导空字符“\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!
}
试试这个:

让realString=NSString(string:nsTaggedPointerString)
试试这个:


让realString=NSString(string:nsTaggedPointerString)

这是一个“NSString的内部类”,您不必担心这一点。如果是空的,那么您的字符串是空的。@Larme-谢谢您的回复,但我认为您没有关注我的帖子。我可以清楚地打印出一个值,所以它不是空的。另外,当它自己使用时,它会生成“”,这是一个“NSString的内部类”,您不必担心这一点。如果是空的,那么您的字符串是空的。@Larme-谢谢您的回复,但我认为您没有关注我的帖子。我可以清楚地打印出一个值,所以它不是空的。另外,当它自己使用时,它会产生“”的效果。我目前正在安装Xcode 8.3,这会花费很长时间,但今晚晚些时候我会尝试你的解决方案。好的,我终于让它工作了!你的建议确实有帮助,但不是一个完整的答案。我还在给你悬赏积分,因为它确实帮助我到达那里。我编辑了我的OP以反映最终代码。谢谢。谢谢你,我会在书中记下这一点。稍后将帮助我:)我目前正在安装Xcode 8.3,这将花费很长时间,但今晚晚些时候我将尝试您的解决方案。好的,我终于让它工作了!你的建议确实有帮助,但不是一个完整的答案。我还在给你悬赏积分,因为它确实帮助我到达那里。我编辑了我的OP以反映最终代码。谢谢。谢谢你,我会在书中记下这一点。以后会帮助我:)