使用 '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
。
在它起作用之前我无法理解问题所在
- (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
。