元组类型的值'(AVAsset?,[AnyHashable:Any]?)'没有成员'url'

时间:2017-01-13 14:09:51

标签: swift2 swift3 migration

我正在学习Swift3,因为我正致力于将代码从swift 2.2迁移到swift 3.我现在陷入了一个错误和几个警告。我需要帮助解决错误。尝试访问AVAsset类型中的url值。我将非常感谢您从中获得的任何帮助或教训。

for index in 0...(assets.count - 1){
   assets[index].fetchAVAssetWithCompleteBlock({ (avAsset) -> Void in
    if let fileURL = avAsset.url{
        let videoData = NSData(contentsOf: fileURL as URL)
        // optionally, write the video to the temp directory
        let videoPath = NSTemporaryDirectory() + "tmpMovie\(index).MOV"
        let videoURL = NSURL(fileURLWithPath: videoPath)
        let writeResult = videoData?.write(to: videoURL as URL, atomically: true)
        if let writeResult = writeResult, writeResult {
           print("success")
        }
        else {
             print("failure")
        }
         self.arrSelectedGalleryMedia.add(videoURL)
        if self.arrSelectedGalleryMedia.count >= assets.count{
             self.UploadVideo()
        }
     }
   else {
        print("error...!")
     }
   })
}

enter image description here

错误如上图所示

enter image description here

不同的尝试

1 个答案:

答案 0 :(得分:1)

avAsset是一个元组,您必须使用AVAsset索引访问0对象。此外,由于它是可选的,您可以使用flatMap选择性地将其操作为videoData

for (i, dkAsset) in assets.enumerated() {
    dkAsset.fetchAVAssetWithCompleteBlock { avAsset in
        if let data = (avAsset as? AVURLAsset).flatMap({
            NSData(contentsOf: $0.url)
        }) {
            if data.write(
                to: URL(
                    fileURLWithPath: NSTemporaryDirectory() + "tmpMovie\(i).MOV"
                ),
                atomically: true
            ) {
                print("success")
            } else {
                print("write failure")
            }
        } else {
            print("cast/read failure")
        }
    }
}