2015-11-16 1 views
0

Я не могу понять, в чем проблема, прежде чем он работалНесовместимые типы указателей, инициализирующие «AVMutableMetadataItem *» с выражением типа «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; 
} 

Спасибо заранее.

ответ

1

Свойства вы пытаетесь присвоить ваши item переменными объявлено как:

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

Это означает, что компилятор ожидает, что каждый элемент массива будет иметь типа AVMetadataItem. Этот класс является суперклассом для AVMutableMetadataItem, и вы не можете назначить ссылку на суперкласс для переменной подкласса.

Причина, по которой она, возможно, работала до этого, заключается в том, что SDK и компилятор не всегда поддерживали дженерики (<AVMetadataItem *> в декларации свойств). Это сработало бы, пока вы не обрабатывали item как изменчивый.

Исправление состоит в том, чтобы либо изменить тип item, либо назначить mutableCopyavItem.asset.metadata[titleIndex].