Задача C быстрая проблема с перечислением - PullRequest
0 голосов
/ 05 марта 2012

Я пытаюсь использовать быстрое перечисление, чтобы напечатать все песни, которые есть в плейлисте, но похоже, что я делаю это неправильно. Может ли кто-нибудь помочь мне? Я определил класс Song следующим образом:

@interface Song : NSObject
@property (nonatomic,strong) NSString *title;
@property (nonatomic,strong) NSString *artist;
@property (nonatomic,strong) NSString *album;
@property (nonatomic,strong) NSString *playtime;
-(void) displaySong;
@end

Функция displaySong выглядит следующим образом:

-(void) displaySong {
NSLog(@"%@ - %@ [%@] - %@\n", artist, title, album, playtime);
}

и теперь для класса PlayList:

@interface PlayList : NSObject{
NSString *name;
NSMutableArray *playlist;
}
-(void) addSongToPlaylist: (Song *) song;
-(void) displayPlaylist;
@end

@implementation PlayList
-(void) addSongToPlaylist: (Song *) nameOfSong{
    [playlist addObject:nameOfSong];
}

-(void) displayPlaylist{
NSLog(@"Playlist called %@:\n", name);
for(id obj in playlist)
{
    if([obj isKindOfClass:[Song class]])
    [obj displaySong];
}
}

// I also tried the displayPlaylist method this way, but it wasn't working either
-(void) displayPlaylist{
NSLog(@"Playlist called %@:\n", name);
for(Song *song in playlist)
{
    [song displaySong];
}

@end

Может кто-нибудь объяснить мне, почему мой код не работает?
А какой метод displayPlaylist лучше?

Ответы [ 2 ]

3 голосов
/ 05 марта 2012

Вы никогда не создаете плейлист

в классе Playlist. Init добавьте playlist = [[NSMutableArray alloc] init] ;

и рассмотрите возможность использования свойства для плейлиста (man - похожие имена довольно раздражают!)

Если вы не хотите иметь инициацию, вы также можете сделать:

-(void) addSongToPlaylist: (Song *) nameOfSong{
    if(!playlist)
        playlist= [[NSMutableArray alloc] init];
    [playlist addObject:nameOfSong];
}

, чтобы ответить на второй вопрос: это зависит

  • если вы знаете, что в массиве есть только экземпляры Song, вторая версия лучше, так как немного быстрее

  • , если вы не знаете, этово-первых, так как в противном случае объект получит сообщение, он не может обработать -> crash

  • или вы можете сделать

    for(id obj in playlist)
    {
        if([obj respondsToSelector:@selector(displaySong)])
        [obj displaySong];
    }
    

    , если хотите быть уверенным, что сообщение понято, независимо от того, что это за объект.

1 голос
/ 05 марта 2012

Вы, похоже, не инициализируете свой массив списков воспроизведения.Вы можете сделать это в своих методах лениво, проверив nil или переопределив метод init для вашего класса PlayList.

...