使用 'AVMetadataItem *' 类型的表达式初始化 'AVMutableMetadataItem *' 的指针类型不兼容?

Incompatible pointer types initializing 'AVMutableMetadataItem *' with an expression of type 'AVMetadataItem *'?

在它起作用之前我无法理解问题所在

 - (NSString *)titleForAudioFileModel:(APAudioPlayerModel *)audioFileModel {
    AVPlayerItem *avItem = [AVPlayerItem playerItemWithURL:[NSURL fileURLWithPath:audioFileModel.filePath]];
    NSUInteger titleIndex = [avItem.asset.commonMetadata indexOfObjectPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) {
        AVMutableMetadataItem *metaItem = (AVMutableMetadataItem *)obj;
        if ([metaItem.commonKey isEqualToString:AVMetadataCommonKeyTitle]) {
            return YES;
        }
        return NO;
    }];

    if (titleIndex == NSNotFound) {
        return @"";
    }
    AVMutableMetadataItem *item = avItem.asset.metadata[titleIndex];// Incompatible pointer types initializing 'AVMutableMetadataItem *' with an expression of type 'AVMetadataItem *'
    return (NSString *)item.value;
}

提前致谢。

您尝试分配给 item 变量的 属性 声明为:

@property(nonatomic, readonly) NSArray <AVMetadataItem *> *metadata

这意味着编译器期望数组中的每一项都是 AVMetadataItem 类型。这个 class 是 AVMutableMetadataItem 的 superclass,你不能将对 superclass 的引用分配给 subclass 的变量。

它之前可能起作用的原因是 SDK 和编译器并不总是支持泛型(属性 声明中的 <AVMetadataItem *>)。只要您不将 item 视为可变的,它就会起作用。

解决方法是更改​​ item 的类型,或分配 avItem.asset.metadata[titleIndex]mutableCopy